是不是sql 语句后面加‘for update’了,如果有的话,你必须去掉,不然会锁定的。其他的update *** 作一张表不会引起资源死锁,你不commit,都是没记录的。
或者一种情况是表被其他表关联,同时并发锁定不释放。另一种情况是大批量的update不提交,导致记忆不足。
如果条件中确定使用了索引,则会锁该行,如没有索引或没使用到索引,则会锁表。
是否使用到索引,利用trace工具判断,这里不做叙述。
建议用主键做索引验证
先打开两个连接session
注:session1此时未提交
session2修改当前数据被阻塞,因为修改属于特殊读这里会使用当前读,修改阻塞说明session1事务加了锁。但此时不能判断是行锁还是表锁。
将session1提交后,session2随即成功提交,这里阻塞了20s左右
session2修改其他数据正常执行,说明锁的是行锁,不是表锁。
session2查询 *** 作正常,因为普通读时由于mysql的mvcc机制会使用的是快照度,所以不会阻塞。
mvcc当前读与快照读及其相关原理这里不做叙述
注:session1此时未提交
session2修改当前数据被阻塞,因为修改属于特殊读这里会使用当前读,修改阻塞说明session1事务加了锁。但此时不能判断是行锁还是表锁。
将session1提交后,session2随即成功提交,这里阻塞了20s左右
session2修改其他数据被阻塞,说明锁的是表锁,不是行锁。
将session1提交后,session2随即成功提交,这里阻塞了20s左右
session2查询 *** 作正常,因为普通读时由于mysql的mvcc机制会使用的是快照度,所以不会阻塞。
mvcc当前读与快照读及其相关原理这里不做叙述
注:for update只有在begin commit,也就是事务之间才会起作用,如果发现两个session都成功对一条数据加锁成功,注意看下是否有没有开启事务。
先打开两个连接session
注:session1此时未提交
由于session1加了锁,session2查询加锁被阻塞,但此时不能判断是行锁还是表锁。
将session1提交后,session2随即成功加锁,这里阻塞了20s左右
session2加锁其他数据正常执行,说明锁的是行锁,不是表锁。
session2修改当前数据被阻塞
session2修改其他数据正常执行
注:session1此时未提交
由于session1加了锁,session2查询加锁被阻塞,但此时不能判断是行锁还是表锁。
将session1提交后,session2随即加锁成功,这里阻塞了20s左右
session2加锁其他数据也被阻塞,说明锁的是表锁,不是行锁。
将session1提交后,session2随即加锁成功,这里阻塞了20s左右
session2修改当前数据被阻塞,但此时不能判断是行锁还是表锁。
将session1提交后,session2随即修改成功,这里阻塞了20s左右
session2修改其他数据同样被阻塞,说明锁的是表锁,不是行锁。
将session1提交后,session2随即修改成功,这里阻塞了20s左右
以上就是关于oracle数据库多个update *** 作一张表会引起资源死锁吗全部的内容,包括:oracle数据库多个update *** 作一张表会引起资源死锁吗、事务/forupdate会锁表吗、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)