【发布时间】: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