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

oogrdqng  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(479)

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

8iwquhpp

8iwquhpp1#

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

7bsow1i6

7bsow1i62#

这个问题被称为幻影阅读。通常可以使用事务的可序列化隔离级别来解决此问题:
https://en.wikipedia.org/wiki/isolation_(数据库系统)
但它会降低性能。因此,如果你有很多的插入比尝试其他选项从评论太多。

相关问题