JDBC 并发事务中执行多条相同的Update语句,为什么会造成死锁?

如题,我在多个线程中并发向A库的XXXX表提交事务,每个事务中执行两条Update语句:
update xxxx set column1 = '11' where ID = '11'
update xxxx set column2 = '22' where ID = '22'
结果在运行过程中抛出死锁异常:
事务(进程ID 211)与另一个进程被死锁在锁|线程资源上,并且已被选作死锁牺牲品。请重新运行该事务。

4个回答

触发了行级锁,一个线程执行了更新语句a,但是未提交事务,此时轮换到另外的线程也执行了a语句,此时产生死锁

qsjh898
qsjh898 也就是说,执行事务中的Update语句,虽然事务还没提交,但是锁已经上了?
4 年多之前 回复

update操作会自动对操作的数据集加上行排他锁,所以多个锁就会死锁啦

gol_phing
Golphing 回复qsjh898: 那本书for update的锁名字都是错的,但是结果都是按照排他锁来的,
4 年多之前 回复
qsjh898
qsjh898 回复Golphing: 第4点表20-8写错了,当前session对actor_id = 178的记录加for update应该是排他锁不是共享锁
4 年多之前 回复
gol_phing
Golphing 回复qsjh898: 两个事物分别加共享锁,然后分别加排他锁。后加排他锁的就会出现死锁。具体请见我的博客:http://blog.csdn.net/gol_phing/article/details/47273411 看第4点的一个例子
4 年多之前 回复
qsjh898
qsjh898 事务A对该行数据加了排他锁之后,事务B不是无法对该行上锁了吗?那还怎么会存在多个锁?
4 年多之前 回复

没有commit; 就是事务提交; 它还没有出来。。 你就进去。 两个人在一起了。出不去,进不来了。你说会不会死锁呢;嘿嘿 ;

qsjh898
qsjh898 前面的事务已经加了行排它锁,后面的事务应该根本进不去才对啊?何来出不去一说?
4 年多之前 回复

多个线程同时执行update,请确保多个线程的UPDATE不会出现同时执行对同一笔记录的更新的情况

baronyang
人鱼传说 回复qsjh898: 多个线程还是在一个进程中,对于数据库来说,会话ID是一样的,进程内多线程的对同一笔记录的update竞争,你可以试一下多线程生成update语句,但不要提交,写到一个列表对象或日志中,看会不会有对同一笔记录更新的语句
4 年多之前 回复
qsjh898
qsjh898 你说的这个是解决办法,我想知道具体为什么。
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问