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

标签 java oracle hibernate

使用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/

相关文章:

java - 强制转换会影响instanceof操作的结果吗?

php - 如何在 php 中使用 oci_new_collection?

json - PL/SQL 中的 APEX_JSON.get_varchar2

sql - 如何使用 oracle 将表和数据从一个数据库复制到另一个数据库

hibernate - Hibernate 查询缓存加载实体

Java Hibernate 奇怪的编码错误?

java - 根据我的金字塔图案打印空格以对齐数字

java - 为什么 == 在 Long 对象中导致 true

java - 按下按钮即可添加新字段

java - 如何解决 HibernateTemplate 的 find(String query) 方法抛出的 NullPointerException