首先,测试的时候,在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,就不开启事务,所以,此处。即使这里抛出了运行时异常,也不会回滚!!!!
调用后
吼吼,第一次写博客,写的不好,请见谅哈,也是自己觉得学习到了,记录一发。。。。。