在 Linux 上的 Oracle 数据库中,“死锁”通常指 数据库层面的死锁(行级/事务级),而不是 Linux 系统级死锁。下面从 原因、常见场景、如何定位和解决 几个角度说明。
Oracle 的死锁 不是 bug,而是应用设计问题,本质是:
两个或多个会话互相等待对方持有的资源,形成循环等待
Oracle 会自动检测死锁,并抛出:
ORA-00060: deadlock detected while waiting for resource
随后 回滚其中一个事务,让另一个继续执行。
场景示例:
| 时间 | Session A | Session B |
|---|---|---|
| T1 | UPDATE T SET X=1 WHERE ID=1 |
|
| T2 | UPDATE T SET X=2 WHERE ID=2 |
|
| T3 | UPDATE T SET X=3 WHERE ID=2(等待 B) |
|
| T4 | UPDATE T SET X=4 WHERE ID=1(等待 A) |
➡️ 形成死锁
✅ 特点:
如果:
⚠️ 会导致:
✅ 这是 DBA 排查的第一项
⚠️ OLTP 系统 强烈不建议使用位图索引
常见原因包括:
DB LINK➡️ 容易造成 跨库死锁或悬挂事务
$ORACLE_BASE/diag/rdbms/xxx/trace/alert_xxx.log
看到:
ORA-00060: Deadlock detected
find $ORACLE_BASE -name "*.trc" | xargs grep -l "deadlock"
trace 文件中会显示:
SELECT
s.sid, s.serial#,
l.type,
l.id1, l.id2,
l.lmode, l.request,
s.sql_id
FROM v$lock l
JOIN v$session s ON l.sid = s.sid
WHERE l.block = 1 OR l.request > 0;
✅ 一般不会
Linux 本身:
但以下情况会 加重或诱发:
➡️ 表现为 等待、挂起,但本质仍是 Oracle 层问题
所有事务按相同顺序访问表和行
CREATE INDEX idx_fk ON child_table(fk_col);
Oracle 死锁 99% 是应用并发访问顺序不合理或外键缺索引导致的,不是 Linux 的问题。
如果你愿意,可以贴出:
ORA-00060 trace我可以帮你 精准分析是哪一类死锁以及如何改。