本文主要简述一下不一样sql语句并发update的状况。sql
update tableA set owner = ? where id = ?
这种状况下,并发执行,最后执行的覆盖掉前面执行的并发
update tableA set owner = ? where id =? and version = ?
这种带有版本号或时间戳的,属于乐观锁方案,并发执行的sql,最早到的执行完以后,版本号发生变化,同一时刻并发的同版本号的update语句因为版本号对不上则没法udpate成功fetch
update tableA set owner = ? where id = ? and owner =?
先到的sql先执行,并且owner发生变化,安排到后执行的sql,因为owner发生变化,则未能执行成功atom
update tableA set totalNum = totalNum + ? where id = ?
这个语句并发执行,最终在db那里仍是会转化为串行,而后加锁进行,最后的效果相似atomic integer的incr。.net
至关于以下:code
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提交成功,他才会得到这个锁,从而对数据进行修改。blog