前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊sql的并发update

聊聊sql的并发update

作者头像
code4it
发布2018-09-17 15:21:32
1.2K0
发布2018-09-17 15:21:32
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要简述一下不同sql语句并发update的情况。

指定主键update

代码语言:javascript
复制
update tableA set owner = ? where id = ?

这种情况下,并发执行,最后执行的覆盖掉前面执行的

指定主键和版本号

代码语言:javascript
复制
update tableA set owner = ? where id =? and version = ?

这种带有版本号或时间戳的,属于乐观锁方案,并发执行的sql,最先到的执行完之后,版本号发生变化,同一时刻并发的同版本号的update语句由于版本号对不上则无法udpate成功

指定主键及与更新字段相关的条件

代码语言:javascript
复制
update tableA set owner = ? where id = ? and owner =?

先到的sql先执行,而且owner发生变化,安排到后执行的sql,由于owner发生变化,则未能执行成功

更新值与原值相关

代码语言:javascript
复制
update tableA set totalNum = totalNum + ? where id = ?

这个语句并发执行,最终在db那里还是会转化为串行,然后加锁进行,最后的效果类似atomic integer的incr。

相当于如下:

代码语言:javascript
复制
1) open a transaction
2) fetch the data (SELECT totalNum FROM tableA WHERE id = ?;)
3) do your work (totalNum + amount)
4) update the data (UPDATE tableA SET totalNum = ? WHERE id = 1;)
5) commit

第一个update会持有id=?这行记录的排它锁,第二个update需要持有这个记录的排它锁的才能对他进行修改,第二个update阻塞直到第一个update提交成功,他才会获得这个锁,从而对数据进行修改。

doc

  • How to deal with concurrent updates in databases?
  • MYSQL-Innodb下,update的并发是否会产生脏数据?
  • SQL处理并发之乐观锁
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 指定主键update
  • 指定主键和版本号
  • 指定主键及与更新字段相关的条件
  • 更新值与原值相关
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档