【问题标题】:How JTA/JTS handle transaction time out issue?JTA/JTS 如何处理事务超时问题?
【发布时间】:2011-11-20 03:27:59
【问题描述】:

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

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

===========

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

我。交易开始

二。睡眠 20 秒

三。系统退出“睡眠结束”

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

===========

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

我。交易开始

二。睡眠 20 秒

三。第一次访问数据库

四。第二次访问数据库

V。系统退出“睡眠结束”

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

===========

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

我。交易开始

二。访问db和db死锁

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

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

感谢您的帮助!

【问题讨论】:

    标签: spring transactions timeout ejb jta


    【解决方案1】:

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

    总结如下:

    • 事务超时控制仅影响事务活动(例如:访问 DB/发送 JMS 消息)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多