spring管理的事务个人测试

首先,测试的时候,在junit下跟tomcat下面,测试的结果有差异,建议都在tomcat下来测试。。。。楼主不才,还未找到原因,希望哪个大神点播点播。好下面进入正题!!!!

  首先,spring中注解方式配置的事务,默认情况下,遇到RuntimeException及其子类的异常时会回滚事务,如图

 

 这里,测试采用软删除,即更改该条数据的状态值,如果执行成功,则状态值为D,否则还是为1,如图


好了,运行。。。。。结果如预料那样没有变化(因为事务回滚的了啊~!)


好,那问题来了,如果我们抛出的是普通的异常,即Exception类呢,来,用事实说话。。。。。。


注意,为了编译通过,在接口类中,也定义抛出该异常,来继续测试。。。。。。。

调用前还是一样为1


好。run~~


咦!居然没有回滚事务,为什么呢,开头就说了呀,spring管理的事务,默认情况下只回滚RuntimeException异常,那不行啊,我业务逻辑自己定义非运行时异常也想回滚啊,那咋办,此时就需要用到事务的rollbackFor属性了,只需要在注解后面加上rollbackFor属性,并且指定回滚的异常类型为Exception.class


好了,继续。。。。。调用前

 

调用后!


生效了!!!!

当然,除了指定回滚异常的类型,我们也能指定不回滚的异常类型 noRollbackFor


如果,不想让自己定义的异常,造成事务回滚,就使用noRollbackFor,楼主亲测可用~~~~~

当然,并不是所有的数据库操作都要配置spring事务,比如我们查询某条记录的时候,毕竟开启事务是需要性能的开销的,如果不需要用到,就没必要开启。这时,我们可以定义spring事务的传播属性,以下是介绍

1) REQUIRED ,这个是默认的属性 
Support a current transaction, create a new one if none exists. 
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 
被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。 
如图所示: 

2) MANDATORY 
Support a current transaction, throw an exception if none exists.支持当前事务,如果当前没有事务,就抛出异常。 

3) NEVER 
Execute non-transactionally, throw an exception if a transaction exists. 
以非事务方式执行,如果当前存在事务,则抛出异常。 

4) NOT_SUPPORTED 
Execute non-transactionally, suspend the current transaction if one exists. 
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

5) REQUIRES_NEW 
Create a new transaction, suspend the current transaction if one exists. 
新建事务,如果当前存在事务,把当前事务挂起。 
如图所示: 

6) SUPPORTS 
Support a current transaction, execute non-transactionally if none exists. 
支持当前事务,如果当前没有事务,就以非事务方式执行。 

7) NESTED 
Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else. 
支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。 

8) PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别 
它们非常 类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。 
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。

如果咱们不需要事务的话,只需要配置propagation属性就行了


这里如果配置成not_supported,就不开启事务,所以,此处。即使这里抛出了运行时异常,也不会回滚!!!!


调用后


吼吼,第一次写博客,写的不好,请见谅哈,也是自己觉得学习到了,记录一发。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值