首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于MySQL内联更新的简单问题

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

Stack Overflow用户
提问于 2015-03-01 14:54:07
回答 1查看 59关注 0票数 0

在这个问题上我有点困惑...出于同样的原因,我们使用事务,在应用我们的逻辑和更新数据库中的行之前,我们当然会用LOCK in SHARE模式选择它。

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

代码语言:javascript
复制
UPDATE table SET num1=num1+1, num2=num2-1 WHERE group='abc'

这样可以在不加锁行/使用事务的情况下始终提供准确的值吗?如果该查询与事务中的其他逻辑一起使用(对于其他查询来说是“必需的”),该怎么办?

EN

回答 1

Stack Overflow用户

发布于 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操作,现在显式地获取独占锁,而不是稍后隐式地获取。共享模式锁旨在防止其他行获得排它锁,并且必须在修改行之前升级,这在一定程度上增加了死锁的可能性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28790966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档