spring 事务无法正常回滚的案例
2014-08-08 11:08
441 查看
自己搭建的工程,想测试spring事务回滚功能,在下面的代码下面测试结果总是不尽人意,有时候可以正常回滚,有时候没有办法正常回滚。下面就是案例的代码:
原因分析,service和dao的获取分别是在两个上下文获取的,对于dao层底层jdbc的异常service层的事务没有办法捕捉到,从而导致事务无法正常回滚,但是为什么设置非空字段为空的时候又可以正常回滚呢,这个原因是dao层直接刨出了这个异常,并不是底层jdbc的异常,所以service层的事务可以捕捉到,从而正常的回滚。
解决方案,只要将service和dao的获取放在同一个上下文中获取,dao底层jdbc异常的时候,事务也同样可以正常回滚。而且有一个非常重要的问题是,当事务的配置没有问题的时候,若异常发生了,但是事务就是不回滚的话,那基本就是这个异常可能没有被service的事务捕捉,从而导致事务无法正常回滚。
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的事务捕捉,从而导致事务无法正常回滚。
相关文章推荐
- mybatis-spring配置正常事务却无法回滚(建表问题)
- 异常捕获不抛出,Spring事务无法回滚 (默认spring只在发生未被捕获的runtimeexcetpion时才回滚。)
- Proxool+hibernate+spring时事务自动回滚导致无法提交的问题解决
- 异常捕获不抛出,Spring事务无法回滚
- Spring MVC @Transactional注解方式事务无法回滚的解决办法
- spring3MVC 事务无法回滚问题
- spring事务、当业务中并没有异常抛出时执行一半的事务无法正常出发导致数据一致性遭到破坏、事务不起作用
- 异常捕获不抛出,Spring事务无法回滚
- 异常捕获不抛出,Spring事务无法回滚
- mybatis整合spring、springmvc时业务层无法进行事务回滚问题解决
- (MySQL)Spring3+Mybatis3使用注解式事务声明(@Transactional)无法回滚
- [spring,mysql] spring使用注解式事务声明(@Transactional)无法回滚 .
- 异常捕获不抛出,Spring事务无法回滚【转载】
- [spring,mysql] spring使用注解式事务声明(@Transactional)无法回滚
- spring+mabitas事务控制无法回滚综合分析
- 关于Spring的@Transactional注解失效以及事务无法回滚问题
- Spring3声明式事务处理事务无法回滚rollback分析(annotation与xml配置混用)
- 异常捕获不抛出,Spring事务无法回滚
- Spring 事务无法回滚
- 异常捕获不抛出,Spring事务无法回滚