关于MySQL内联更新的简单问题

时间:2015-03-01 06:54:07

标签: mysql

我在这个问题上有点混乱...出于同样的原因我们使用事务,在应用逻辑和更新数据库中的行之前,我们当然选择LOCK IN SHARE MODE。

但是我的问题是,如果有数值的内联更新查询:即:

UPDATE table SET num1=num1+1, num2=num2-1 WHERE group='abc'

这会在不锁定行/使用交易的情况下始终提供准确的值吗? 如果此查询与事务中的其他逻辑一起使用(对于某些其他查询是“必需的”),该怎么办。

1 个答案:

答案 0 :(得分:0)

是的,它会,因为在InnoDB中完成的所有操作都是在事务中。如果您没有自己启动事务,InnoDB会为您启动它,并且事务只持续一个语句。行操作总是原子的。

  

在InnoDB中,所有用户活动都发生在事务中。如果启用了自动提交模式,则每个SQL语句自己形成一个事务。默认情况下,MySQL为启用了自动提交的每个新连接启动会话,因此如果该语句没有返回错误,MySQL会在每个SQL语句后执行提交。

     

http://dev.mysql.com/doc/refman/5.6/en/innodb-transaction-model.html

顺便说一下,基于问题的其余部分...当你知道你要更新一行时,你应该SELECT ... FOR UPDATE并继续现在明确地采用排他锁,而不是隐含地,后来。共享模式锁用于防止其他行获取排它锁,并且必须先升级才能修改该行,这会增加死锁的可能性。