【问题标题】:MySQL update tabel set count = count +1 concurrent issueMySQL更新表集计数=计数+1并发问题
【发布时间】:2018-10-12 10:51:21
【问题描述】:

我需要更新一个表并在每次调用时设置VOTE_COUNT = VOTE_COUNT + 1,假设我有 10,000 个并发访问数据库并同时执行相同的语句:

UPDATE VOTE SET VOTE_COUNT = VOTE_COUNT + 1;

会不会是任何并发问题导致结果不等于 10000? (初始计数 = 0)

【问题讨论】:

  • 可能取决于您的底层存储引擎。对于 innodb 我会说不,对于 myisam 我会说是。
  • 引擎可能会影响这个的任何原因?在此先感谢:)
  • 事务处理与否。如果没有事务处理,锁定也很重要。这会导致其表锁定时性能不佳。

标签: mysql database concurrency


【解决方案1】:

根据 mysql/mariadb 底层存储引擎,您可能会遇到并发或性能问题。

最好有一个带有事务处理的存储引擎——这样你就不会遇到并发问题。

对于您使用没有事务处理的存储引擎的情况,它取决于锁定(否,基于行或表)。

如果没有锁定,您可能会遇到并发问题,因为两个更新语句可以同时读取一个值,加 1 并将其存储回来 - 所以一个(或多个)更新语句会丢失!因为它们都将存储相同的值。

为每次更新锁定表时,并发更新语句的速度会变得非常慢!

【讨论】:

  • 那么 InnoDB 应该是安全的吗?
  • 是的,innoDB 应该可以完成这项工作。也是我个人的首选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多