spring - JTA/JTS 如何处理事务超时问题?

标签 spring transactions timeout ejb jta

以下是我对 JTA/JTS 处理事务超时问题的理解。但我找不到我的文件或 Material 来支持我的理解。我的理解对吗?你知道有什么 Material 是指这个问题吗?

Application Server 遍历所有事务以检查超时。如果发生事务超时,应用程序服务器会为事务标记回滚,并记录详细信息。 但此时Application Server既不抛出异常也不中断事务。 当事务线程继续尝试访问另一个事务资源(如 JDBC/JMS)时,实现 JTA 接口(interface)的事务资源会先检查回滚标志,然后再继续。然后在这个时候,就抛出了 RollbackException。

==========

测试用例 1:
将事务超时设置为 10 秒

一、交易开始

二、 sleep 20 秒

三、系统退出“ sleep 结束”

结果:超时发生在第 10 秒,系统退出记录超时详细信息,但不抛出异常。将打印“ sleep 结束”。

==========

测试用例 2:
将事务超时设置为 10 秒

一、交易开始

二、 sleep 20 秒

三、第一次访问数据库

四。第二次访问数据库

五、系统退出“ sleep 结束”

结果:超时发生在第 10 秒,系统输出记录了超时详细信息,但没有抛出异常。第一次访问数据库时抛出异常。不会打印“ sleep 结束”。

==========

测试用例 3:
将事务超时设置为 10 秒

一、交易开始

二、访问db和db死锁

结果:超时发生在第 10 秒,系统输出记录了超时详细信息。没有异常抛出,事务线程卡住了。 所以事务超时控制无法处理数据库超时问题。 我对此感到很困惑..

据我了解,上述行为在使用 Spring 事务管理(JTA)和 EJB 时应该是相同的。我对吗?

感谢您的帮助!

最佳答案

经测试,证明我的理解应该是正确的。

将结果总结如下:

• 事务超时控制仅影响事务事件(例如:访问数据库/发送 JMS 消息)。

• 应用服务器在超时发生时不会立即中断当前事务线程,而是应用服务器只记录细节。事务提交或尝试访问下一个事务事件时将抛出超时异常。

• 事务超时控制无法处理数据库死锁问题。但是 DB2 有死锁防止机制来释放死锁并在某些情况下回滚事务。

关于spring - JTA/JTS 如何处理事务超时问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469661/

相关文章:

java - 为什么我在 spring 上下文之外得到关闭的 session

spring - Spring Batch 和 Spring Cloud Deployer kubernetes 中的 Worker pod 资源限制

java - REST Web 应用程序中的 Spring 3 MVC 示例在哪里下载?

java - Spring事务只读和隔离级别

exception-handling - Java EE : @ApplicationException thrown, 仍然回滚事务

java - MySQL:考勤监控应用程序问题

batch-file - 如果 ping 响应时间过长,则运行备用功能

javascript - 在 AngularJS 单元测试中断言递归 $timeout 中的 http 调用次数

java - Spring : PropertyPlaceholderConfigurer cannot find property file

java - 回滚在 Java 中不起作用