假设我有两个EJB A和B:
public class A implements AInterface {
private B b;
...
//This method will NOT access database directly
public void a() {
//do something
b.b();
//do something
}
...
}
public class B implements BInterface {
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public void b() {
//Read database
}
}
对A.a()的调用是否会在事务中运行?输入A.a(),输入B.b(),访问数据库或其他时间时是否启动事务?
基线是我不希望在事务中运行它,所以我可以使用NOTSUPPORTED作为Aa(),我猜(?),但我也想了解如何在不同的调用堆栈中涉及或不涉及数据库会影响事务。
答案 0 :(得分:3)
事务不依赖于数据库连接本身。在EJB中,事务不仅仅是数据库事务。事务可以包括多个资源(请参阅XA transactions)和几个方法调用。只有当所有这些都成功时,交易才会成功。
在您的情况下,A没有TransactionAttribute并且运行为REQUIRED。这将在A.a()开始时打开一个新的交易。 B.b()的调用在来自A的事务内部运行。但是在B.b()完成之后,数据库事务不会被提交。首先,A.a()必须完成。如果在调用B.b()之后在A.a()中有例外,则会回滚B.b()。
如果你想在任何情况下提交B.b(),我建议使用RequiresNew而不是NotSupported。
您可以在Java EE Tutorial找到所有交易属性的说明。