使用Java、Hibernate和Oracle数据库。 我有两个并发进程:
- Process1 从 table1 中删除一些实体。 (多个:从 table1 中删除,其中 id =...)由 native hibernate 查询完成。
- 进程2 更新表1 中的相同/其他实体。 (多个:更新 table1 set name=... where id=...)通过 jpa 存储库删除方法完成。
目前有时会出现异常
CannotAcquireLockException is thrown,
(SQL Error: 60, SQLState: 61000..
ORA-00060: deadlock detected while waiting for resource)
所以,问题是:发生了什么事以及如何避免异常?有什么解决办法吗?
重要提示:如果发生冲突,如果删除成功并且更新不会执行任何操作,我会感到满意。
最佳答案
session A 等待 B,B 等待 A - 这就是死锁的本质。 无需再等待,Oracle 将终止其中一个 session 。
选项 1
创建信号量以有效地序列化并发进程。
创建表 my_semaphore(dummy char(1));
第 1 节:
LOCK TABLE my_semaphore in exclusive mode;
UPDATE <your update here>;
COMMIT;
第二节:
LOCK TABLE my_semaphore in exclusive mode;
DELETE <your delete here>;
COMMIT;
选项 2 尝试以相同的顺序使用两个语句处理行,例如按 rowid 或其他顺序。
因此,如果 A 被 B 锁定的行困在后面, session B 永远不会返回 A 持有的行。这更加棘手且占用资源。
关于java - 一张表的并发更新和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43192094/