对于JBoss中容器管理的事务的疑惑
我在SessionBean中写了一方法,该方法实现了对于同一个数据源,两步数据库的操作,都是直接调用的SQL语句。第一个SQL语句负责对一个已经存在的表进行插入记录的操作,它下面紧接的SQL对一个不存在的表做更新操作。SessionBean是容器管理的事务,并且该SessionBean中所有方法都是Required。本以为捕获到SQLException后(表或视图不存在),EJB Container会对事务做回滚操作。可实际上,EJB Container并没有这么做,我查了下数据库,发现记录已经插入进去了!
我后来把由容器管理的事务改为Bean管理的事务,于是在代码里加了
UserTransaction ut = null;
try {
ut = sessionContext.getUserTransaction();
ut.begin();
....
ut.commit();
}catch(SQLException es) {
es.printStackTrace();
try{
ut.rollback();
}catch(SystemException se) {
}
}
.....
用这样Bean管理的事务的时候,就没有问题,事务可以回滚,不会有记录被插入。
更有意思的是,我还是用容器管理的事务类型,我尝试在SQLException的catch中抛出更底层一点的异常 throw new RuntimeException();事务居然能正常回滚!
这个问题困绕了我两天,不知大家可否遇到,有兴趣的话试试,期盼各位的结果!
开发环境JBoss3.0.8 + JBuilder9.0 + JBossOpenTool(本人试过JBoss3.2.3,JBoss3.2.5结果都一样)