gpt4 book ai didi

java - 将 PROPAGATION_REQUIRED_NEW 与两个单独的 spring bean 一起使用时的 Oracle 数据库锁定

转载 作者:行者123 更新时间:2023-11-30 02:57:00 25 4
gpt4 key购买 nike

我有 2 个访问数据库的 spring bean(Bean A 和 B)。两个 bean 都处于 PROPAGATION_REQUIRED_NEW 状态,并且在 ORACLE 数据库上隔离级别为 READ COMMITED。

Bean 使用不同的条件在同一个表上调用一次选择(通过 Hibernate)两次。然后,针对表中的每一行调用 bean B 来对它们进行更新。奇怪的是,如果 Bean A 仅对数据库进行一次调用(选择),则一切正常。我已经检查了来自 dba.stackexchange 的查询并且只有当 Bean A 中的第二个“select”具有数据库锁时。

注意:为什么 bean B 不使用 PROPAGATION_REQUIRED 或 PROPAGATION_NESTED ?我们不使用 PROPAGATION_REQUIRED 因为如果其中一行失败并且对于 PROPAGATION NESTED 我们使用的 jdbc 驱动程序版本不支持它,我们不会回滚所有内容。

我当前的解决方法是让一个 bean 单独处理选择,并且主 bean 不执行任何事务,只需调用另外两个 bean。我只是觉得很奇怪,当我们提供 NONE 锁定并且处于 READ_COMMITED 状态时,执行“select * from X”会导致表锁定。我在这里遗漏了什么吗?

第一个查询:

select
temptable0_.ID as ID1_43_,
temptable0_.IDSEND as IDS2_43_,
temptable0_.DATERECEI as DAT3_43_,
temptable0_.DATEPROC as DAT4_43_,
temptable0_.STATUT as STA5_43_,
temptable0_.ERROR_TYPE as ERR6_43_,
temptable0_.CODE as COD7_43_,
temptable0_.DESCRIPTION as DES8_43_,
temptable0_.NOTIF as NOT9_43_,
temptable0_.ACTION as ACT10_43_,
temptable0_.IDCLIENT as IDC11_43_,
temptable0_.PARAM as PAR12_43_
from
TABLE_TMP temptable0_
where
temptable0_.STATUT in (
'NEW'
)

第二个查询(同一事务(BEAN A))

select
temptable0_.ID as ID1_43_,
temptable0_.IDSEND as IDS2_43_,
temptable0_.DATERECEI as DAT3_43_,
temptable0_.DATEPROC as DAT4_43_,
temptable0_.STATUT as STA5_43_,
temptable0_.ERROR_TYPE as ERR6_43_,
temptable0_.CODE as COD7_43_,
temptable0_.DESCRIPTION as DES8_43_,
temptable0_.NOTIF as NOT9_43_,
temptable0_.ACTION as ACT10_43_,
temptable0_.IDCLIENT as IDC11_43_,
temptable0_.PARAM as PAR12_43_
from
TABLE_TMP temptable0_
where
temptable0_.STATUT in (
'ERROR'
)

以及Update语句(由BEAN B完成)

   update
TABLE_TMP
set
IDSEND=?,
DATERECEI=?,
DATEPROC=?,
STATUT=?,
ERROR_TYPE=?,
CODE=?,
DESCRIPTION=?,
NOTIF=?,
ACTION=?,
IDCLIENT=?,
PARAM=?
where
ID=?

当 IDSEND 递增时,如果出现错误或成功,则设置 DATEPROC,并设置 STATUT 和 ERROR_TYPE。

最佳答案

Oracle不支持READ UNCOMMITED。您使用的默认模式是READ COMMITTED

如果您尝试从其他 session 中选择具有待处理事务更改的记录,则必须等待更新提交。

关于java - 将 PROPAGATION_REQUIRED_NEW 与两个单独的 spring bean 一起使用时的 Oracle 数据库锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36983071/

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