我是靠谱客的博主 忧郁小猫咪,最近开发中收集的这篇文章主要介绍sql的并发update,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

指定主键update

update tableA set owner = ? where id = ?

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

指定主键和版本号

update tableA set owner = ? where id =? and version = ?

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

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

update tableA set owner = ? where id = ? and owner =?

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

更新值与原值相关

update tableA set totalNum = totalNum + ? where id = ?

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

相当于如下:

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提交成功,他才会获得这个锁,从而对数据进行修改。

最后

以上就是忧郁小猫咪为你收集整理的sql的并发update的全部内容,希望文章能够帮你解决sql的并发update所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部