在这个问题上我有点困惑...出于同样的原因,我们使用事务,在应用我们的逻辑和更新数据库中的行之前,我们当然会用LOCK in SHARE模式选择它。
但是我的问题是,如果有一个数值的内联更新查询:即:
UPDATE table SET num1=num1+1, num2=num2-1 WHERE group='abc'这样可以在不加锁行/使用事务的情况下始终提供准确的值吗?如果该查询与事务中的其他逻辑一起使用(对于其他查询来说是“必需的”),该怎么办?
发布于 2015-03-02 05:06:38
是的,它会的,因为在InnoDB中做的每件事都是在一个事务中进行的。如果您不自己启动事务,InnoDB会为您启动它,并且该事务只持续一条语句。行操作始终是原子的。
在InnoDB中,所有用户活动都发生在事务内部。如果启用了自动提交模式,则每条SQL语句将单独形成一个事务。默认情况下,MySQL在启用自动提交的情况下为每个新连接启动会话,因此,如果每条SQL语句没有返回错误,MySQL将在该语句之后执行commit。
http://dev.mysql.com/doc/refman/5.6/en/innodb-transaction-model.html
顺便说一句,根据剩下的问题...当您知道要更新一行时,您应该执行SELECT ... FOR UPDATE操作,现在显式地获取独占锁,而不是稍后隐式地获取。共享模式锁旨在防止其他行获得排它锁,并且必须在修改行之前升级,这在一定程度上增加了死锁的可能性。
https://stackoverflow.com/questions/28790966
复制相似问题