【问题标题】:How to know whether a Java method is using new JTA transaction or not?如何知道 Java 方法是否正在使用新的 JTA 事务?
【发布时间】:2015-08-23 17:52:38
【问题描述】:

我在我的 EJB 应用程序中使用容器管理的事务。

我有两个无状态的 Java 对象,分别是 A 类和 B 类。

B 类在 A 类的方法中实例化。

B 类有两种方法:方法 A 和方法 B。

方法 A 使用事务类型 = requires_new

方法 B 使用事务类型 = 必需

这两种方法分别有2条sql插入语句。方法A和方法B的sql语句不同。

我发现如果方法B发生任何错误,方法A中的一切都是回滚。这不是我想要的。即使方法 B 引发系统异常,我也希望方法 A 中的所有内容都已提交。

因此,我不认为方法 A 和 B 正在使用不同的事务运行。

我可以知道有没有办法 system.out.println 一个布尔值来显示 JTA 事务是否是新的?

谢谢。

下面是附加的伪代码 sn-p 以澄清我上面的问题。

stateless class A{
  method(){
    Class b = new Class B();
    b.methodA();
    b.methodB():
  }
}

stateless class B(){
   method A(){ // There is an insert statement here.}
   method B(){ // There is another insert statement here.}

   //If anything happen in method B, only rollback B, don't rollback A.
 }

【问题讨论】:

  • 可以从 TransactionManager (docs.oracle.com/javaee/7/api/javax/transaction/…) 获取与当前线程关联的事务,并通过其哈希码与另一个进行比较。
  • 如果methodA有Requires_new,在methodB出现问题的情况下不应该回滚,因为它应该已经提交了。请参阅此post。你在运行什么服务器?
  • 嗨,加油。我正在使用 weblogic 我非常怀疑问题是由 weblogic 服务器设置引起的。我的代码应该可以工作。
  • Alex Erohin,因为这是容器类型,而不是 bean 类型;我不认为我们可以获取 transactionManager 对象。调用 entityManager.getTranasaction(); 时出现错误;

标签: java oracle transactions ejb jta


【解决方案1】:

您正在与方法 A 相同的事务中运行方法 B。因此方法 B 的失败将回滚方法 A 中发生的插入。

如果您不希望方法 B 干扰方法 A,请在不同的事务中运行这两个方法。

如果您使用的是Spring,可以使用TransactionSynchronizationManager 查找事务级别信息。

【讨论】:

  • 我能知道如何在不同的事务中同时运行吗?我认为 required_new 和 required 足以将两者分成两个事务。
  • 无论如何这是在 EJB 中运行,而不是 Spring。任何的想法?很多tqs。
  • 按什么顺序调用 methodA 和 methodB ?
  • 请参见上面的附加伪代码 sn-p。我刚刚编辑了这个问题。非常感谢。
猜你喜欢
  • 2011-06-10
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 2012-05-24
  • 1970-01-01
  • 2012-06-28
相关资源
最近更新 更多