MySQL中的并发插入和竞争条件

时间:2018-09-24 19:53:37

标签: mysql concurrency insert race-condition high-load

我有一种情况,我应该限制表中每个用户的行数。现在,我在插入之前通过COUNT * FROM table检查,如果计数等于/大于允许值,则会抛出错误。在单个事务中运行COUNT和INSERT查询。 但是,对于5000个在线用户和每分钟5万个请求,我在表中有额外的记录(超过限制)。看起来像是并行插入时的竞争条件。如何避免这种情况?谁能建议一些最佳做法?

2 个答案:

答案 0 :(得分:1)

使用一个单独的表,该表将维护用户和插入的行数。使用userid作为主表的外键。现在,如果您有一个基于会话的应用程序,则可以将数据加载到会话或内存中,并在每次在会话/内存和数据库中插入数据后继续获取数据/更新计数,然后实际插入到主表中。

答案 1 :(得分:0)

该问题称为虚拟阅读。通常,可以使用可序列化隔离级别的事务来解决此问题:

https://en.wikipedia.org/wiki/Isolation_(database_systems)

但是它会降低性能。因此,如果您有很多插入内容,那么也可以尝试使用注释中的其他选项。