您的位置:首页 > 编程语言 > Java开发

spring 事务无法正常回滚的案例

2014-08-08 11:08 441 查看
自己搭建的工程,想测试spring事务回滚功能,在下面的代码下面测试结果总是不尽人意,有时候可以正常回滚,有时候没有办法正常回滚。下面就是案例的代码:

public class TestServiceImpl implements ITestService {

@Transactional(/*rollbackForClassName="Exception,RuntimeException"*/)
public void hibernatetmpSave(TBBS_Test test, TBBS_TestA testa) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
ITestDao dao = (ITestDao) ac.getBean("testDao");
ITestaDao daoa = (ITestaDao) ac.getBean("testaDao");
/*
PlatformTransactionManager txManager = (PlatformTransactionManager)ac.getBean("transactionManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try {
daoa.save(testa);

dao.save(test);

txManager.commit(status);

} catch (RuntimeException e) {
txManager.rollback(status);
e.printStackTrace();
}
*/

try {
daoa.save(testa);

//String a = null;
//a.trim();

dao.save(test);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("run time exception");
}
}
}

    public void save(T entity) {
        getHibernateTemplate().save(entity);
    }
上面的代码在测试中,可以得到如下的测试结果,若test实体的某个非空字段为空,testa的数据可以正常回滚,若test是主键重复或者超过数据长度则无法正常回滚。

原因分析,service和dao的获取分别是在两个上下文获取的,对于dao层底层jdbc的异常service层的事务没有办法捕捉到,从而导致事务无法正常回滚,但是为什么设置非空字段为空的时候又可以正常回滚呢,这个原因是dao层直接刨出了这个异常,并不是底层jdbc的异常,所以service层的事务可以捕捉到,从而正常的回滚。

解决方案,只要将service和dao的获取放在同一个上下文中获取,dao底层jdbc异常的时候,事务也同样可以正常回滚。而且有一个非常重要的问题是,当事务的配置没有问题的时候,若异常发生了,但是事务就是不回滚的话,那基本就是这个异常可能没有被service的事务捕捉,从而导致事务无法正常回滚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: