Jakarta ee 在EJB中使用事务类型
我举了以下例子:Jakarta ee 在EJB中使用事务类型,jakarta-ee,transactions,ejb,Jakarta Ee,Transactions,Ejb,我举了以下例子: public class MyEJBService implements javax.ejb.SessionBean { public void modifyAllItems() { doSomething... for(...) { modifyItem(item); } } public void modifyItem
public class MyEJBService implements javax.ejb.SessionBean {
public void modifyAllItems() {
doSomething...
for(...)
{
modifyItem(item);
}
}
public void modifyItem(Item item) {
doSomething...
}
}
方法1=修改所有项目
方法2=修改项目
Method1多次调用method2。我想在method1禁用事务,但在method2启用事务。method2的每次调用都应该在不同的事务中进行(如果在修改项时发生错误,则某些项可能已被修改,而其他项则保持不变)。我已经为method1()定义了一个EJB事务类型-NEVER,为method2()定义了另一个EJB事务类型-需要NEW。问题是,当我调用method2()时,EJB似乎没有创建任何事务,因为当method2()内发生错误时,它不会回滚(如果method2内的数据库发生了更改,但在method2完成之前抛出异常,则数据库不会返回到以前的状态-回滚)。这是预期的行为吗?我有点困惑。非常感谢。是的,这是预期的行为,因为事务是使用代理实现的,因此仅当从第三方对象调用EJB方法时才应用。如果希望在从method1()调用时应用method2()事务,则必须将其移动到第二个EJB对象。是的,这是预期的行为,因为事务是使用代理实现的,因此仅当从第三方对象调用EJB方法时才应用。如果希望在从method1()调用时应用method2()事务,则必须将其移动到第二个EJB对象。另一个想法是Bean管理事务,下面是步骤
会话语境
public void modifyAllItems()
{
doSomething();
for(...)
{
UserTransaction trans=context.getUserTransaction();;
try
{
trans.begin();
modifyItem(item);
trans.commit();
}catch(Exception e)
{
trans.rollback();//if need propagation then:trans.setRollbackOnly();
}
}
}
public void modifyItem(Item item) {
doSomething();
}
@Override
public void setSessionContext(SessionContext context) throws EJBException,
RemoteException {
this.context = context;
}
另一个想法是Bean管理事务,下面是步骤
会话语境
public void modifyAllItems()
{
doSomething();
for(...)
{
UserTransaction trans=context.getUserTransaction();;
try
{
trans.begin();
modifyItem(item);
trans.commit();
}catch(Exception e)
{
trans.rollback();//if need propagation then:trans.setRollbackOnly();
}
}
}
public void modifyItem(Item item) {
doSomething();
}
@Override
public void setSessionContext(SessionContext context) throws EJBException,
RemoteException {
this.context = context;
}
谢谢!现在假设我正在从EJB对象外部调用modifyAllItems(),modifyAllItems()和modifyItem()都使用默认的必需EJB事务类型。客户端没有运行任何事务,因此在调用modifyAllItems()时将启动一个新事务。为什么EJB在modifyItem时决定使用相同的事务()是从modifyAllItems()内部调用的?我的意思是,如果服务是从同一EJB对象内的另一个服务内部调用的,EJB事务类型配置是否重要?谢谢!现在想象一下,我是从该EJB对象外部调用modifyAllItems(),同时调用modifyAllItems()和modifyItem()需要使用默认的EJB事务类型。客户端未运行任何事务,因此在调用modifyAllItems()时将启动新事务。为什么EJB在从modifyAllItems()内部调用modifyItem()时决定使用相同的事务?我的意思是,如果从同一EJB对象内的另一个服务中调用服务,EJB事务类型配置是否重要?也可以在EJB3规范中使用@TransactionManagement(TransactionManagementType.BEAN)注释。也可以使用@TransactionManagement(TransactionManagementType.BEAN)EJB3规范中的注释。