oracle数据库多个update *** 作一张表会引起资源死锁吗

oracle数据库多个update *** 作一张表会引起资源死锁吗,第1张

是不是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会锁表吗、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10194899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存