MySQL 并发更新

Posted

技术标签:

【中文标题】MySQL 并发更新【英文标题】:MySQL concurrent updates 【发布时间】:2018-06-21 09:04:03 【问题描述】:

我有小型 POS 系统,服务器端使用 phpmysql (InnoDB)。 当“销售”完成时,执行以下查询以更新库存数量:

"UPDATE products SET qty=qty-:qty, ustatus=1 WHERE pid=:pid";

这个语句是否是“并发更新安全”,这意味着我需要任何事务或锁定表。

我只是想确定,像这样的多个查询是同时执行的 不会弄乱我的库存。

【问题讨论】:

你可以查看这个帖子***.com/questions/4980801/… 【参考方案1】:

    如果你使用innodb,那么all sql statements在一个事务中执行,你不需要显式指定。

    并发控制是通过锁而不是事务来完成的。事务可能只决定锁的寿命。

    更新语句放置一个exclusive lock on the records that it wants to modify,意思是no other statements can modify(有时甚至无法读取)锁定的记录,直到排他锁被释放。因此,从并发的角度来看,您的语句是安全的。

【讨论】:

这是否意味着,当记录被锁定时,以下查询将被放入队列并稍后执行? 是的,类似的东西。但是,问题中的更新语句是原子的,并且您似乎在事务中没有其他语句,因此任何锁都只会保留几分之一秒,因此不会进行真正的排队。

以上是关于MySQL 并发更新的主要内容,如果未能解决你的问题,请参考以下文章

MySQL更新表设置count = count +1并发问题

Mysql 和 java:当涉及到并发更新时如何处理多个用户

如何处理mysql数据库并发更新问题

Mysql和Redis数据同步策略

mysql 乐观锁实现

MySQL如何加锁避免并发事务导致的脏写?