gpt4 book ai didi

java - JDBC 事务死锁 : solution required?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:58:34 24 4
gpt4 key购买 nike

我的 friend 描述了一个场景并要求我寻找解决方案。他正在使用 Oracle 数据库和 JDBC 连接,并将读取提交作为事务隔离级别。在其中一个事务中,他更新了一条记录,执行了一条选择语句并提交了事务。当一切都发生在一个线程中时,一切都很好。但是当处理多个请求时,就会发生死锁。

  1. Thread-A 更新一条记录。
  2. 线程 B 更新了另一条记录。
  3. 线程A发出select语句,等待线程B的事务完成提交操作。
  4. 线程-B 发出 select 语句,等待线程-A 的事务完成提交操作。

以上导致死锁。由于它们使用命令模式,基本框架只允许发出一次提交(在所有数据库操作结束时),因此它们无法在 select 语句之前立即发出提交。

我的论点是:Thread-A 应该选择所有已提交的记录,因此不应发布。但是他说Thread-A肯定会等到Thread-B提交记录。是真的吗?

有什么方法可以避免上述问题?是否可以更改隔离级别(不更改底层 Java 框架)?

关于基础框架的一些信息:它类似于Struts action,每个请求都由一个action处理,事务在执行前开始,执行后提交。

最佳答案

我相信你的 friend 是正确的如果选择是为了更新另一个线程已经更新(但尚未提交)的记录。如果他们只是选择数据,而 JDBC 框架没有通过强制选择更新来帮助您,那么您是对的。

为避免此问题,请确保仅在确实需要更新时才选择更新,在这种情况下,请在选择中使用 NOWAIT 选项。如果操作会阻塞,这将导致引发错误。

Oracle 将检测死锁并回滚其中一个涉及的事务。

关于java - JDBC 事务死锁 : solution required?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2571661/

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