关于oracle数据库死锁,请大神进。为什么用java synchronized 关键字解决不了?怎么解决死锁问题?

2025-03-04 19:37:21
推荐回答(4个)
回答1:

我记得如果真的出现相互等待的会话的时候,oracle会自动检测到死锁发生,并报错:ORA-00060.
而一般网上所说的大部分都是锁资源争用问题,并不是真正的死锁.
不行你可以实验一下,开2个会话,一个更新表A的行R1,不提交,然后另外一个会话更新行R2,不提交;
然后再回到第一个会话更新行R2,在第二个会话更新行R1,此时就出现相互等待的状态.也就是死锁的条件成立了.
ORACLE的自动锁管理机制此时会马上检测到死锁发生,并给出错误信息:
ORA-00060: 等待资源时检测到死锁

所以你们程序里的这种并不是真正的死锁.只是锁争用. 这个是设计上的问题,要按照业务逻辑进行事务分解.也就是说业务上连续的操作放在一个事务里.并且某些特殊情况下也需要FOR UPDATE加行锁来防止其他会话进行修改

回答2:

因为你在关掉oracle进程相当与做了commit或者rollback操作
你们这种情况问题在于程序做完更新后语句里面没有及时提交操作
严格来这种情况并不是死锁,而是因为更新操作正常的一个表锁。
建议你们更改程序,做任何一条更新完毕后面加一个commit
不要更新2条记录后再提交,因为这样就有可能2个session互相锁住

回答3:

操作表的时候 lock table in exclusive mode
更新表记得 提交 COMMIT
结束会话 alter system kill session 'sid,serial#'
希望帮助你 ...........

回答4:

在数据库层用select for update,把记录锁住