我有以下示例:
public class MyEJBService implements javax.ejb.SessionBean {
public void modifyAllItems() {
doSomething...
for(...)
{
modifyItem(item);
}
}
public void modifyItem(Item item) {
doSomething...
}
}
方法1 = modifyAllItems 方法2 = modifyItem
Method1多次调用method2。我想在method1禁用事务,但在method2启用事务。方法2的每次调用应该处于不同的事务处(如果在修改项目时发生错误,则某些项目可能已被修改而其他项目保持不变)。我已经为method1()定义了一个EJB事务类型 - NEVER和另一个for method2() - 需要新的。问题是,当我调用method2()时,EJB似乎没有创建任何事务,因为当method2()内部发生错误时,它不会回滚(如果在method2内的数据库中发生了某些更改但是它会抛出在method2 completition之前的异常,数据库没有返回到先前的状态 - rollback)。这种行为有望吗?我有点困惑。非常感谢你。
答案 0 :(得分:2)
是的,这是预期的行为,因为事务是使用代理实现的,因此只有在从第三方对象完成对EJB方法的调用时才应用。如果您希望在从method1()调用时应用method2()事务,则必须将其移动到第二个EJB对象。
答案 1 :(得分:1)
另一个想法是Bean管理事务,下面是步骤
ejb-jar.xml中
<交易类型>豆类和LT; /交易类型>
代码
public class MyEJBService实现了javax.ejb.SessionBean {
SessionContext上下文;
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;
}