gpt4 book ai didi

java - 一张表的并发更新和删除

转载 作者:行者123 更新时间:2023-12-02 02:55:16 25 4
gpt4 key购买 nike

使用Java、Hibernate和Oracle数据库。我有两个并发进程:

  1. Process1 从 table1 中删除一些实体。 (多个:从 table1 中删除,其中 id =...)由 native hibernate 查询完成。
  2. 进程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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com