首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有显式锁定和读提交隔离级别的Oracle死锁,为什么?

没有显式锁定和读提交隔离级别的Oracle死锁,为什么?
EN

Stack Overflow用户
提问于 2011-09-04 23:05:16
回答 2查看 2.5K关注 0票数 1

即使我没有使用任何显式的表锁并且我的隔离级别设置为READ COMMITTED,我也得到了这个错误Message: ORA-00060: deadlock detected while waiting for resource

我通过默认传播在Spring TransactionTemplate上使用了多个线程。在我的业务逻辑中,数据是分开的,因此两个事务永远不会有相同的数据集。因此我不需要SERIALIZABLE

为什么Oracle可以检测到死锁?死锁在这个星座中是不可能的,还是我错过了什么?如果我没有遗漏任何东西,那么我的分离算法一定是错的,对吧?或者还有其他的解释呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-04 23:57:06

默认情况下,Oracle执行行级锁定。你提到使用多线程。我怀疑一个线程正在锁定一行,然后试图锁定已被另一个线程锁定的另一行。然后,另一个线程尝试锁定第一个线程锁定的行。此时,Oracle将自动检测死锁并打破它。上面提到的两行可以在同一个表中,也可以在不同的表中。

仔细检查每个线程都在做什么是起点。可能需要决定不并行运行,或者可能需要使用显式锁定机制(例如,select for update )。

您发现的内容和任何其他问题的LMK…。

K

票数 4
EN

Stack Overflow用户

发布于 2011-09-05 01:42:04

遇到死锁本身与序列化级别无关。当插入/更新/删除一行时,oracle会锁定该行。如果有两个事务同时运行并试图更改同一行,则可能会遇到死锁。对“能”的强调。如果不同类型的事务以不同的顺序获取锁,通常会发生这种情况,这是糟糕的事务设计的标志。

如前所述,遇到死锁时会生成一个跟踪文件。如果查看跟踪文件,就可以确定死锁涉及哪两个会话。此外,它还显示了相应的SQL语句。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7300077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档