事务失效场景
其实就是AOP注解失效的场景
-
方法用final修饰,导致无法代理
-
方法内部调用,无注解方法调用有注解方法会失效。可以注入自己的类再去调用
-
未被Spring管理
-
方法不是public修饰符(源码判断必须是public才行)
-
手动捕获异常并不抛出
事务类型
- 扁平事务(Flat Transactions)
- 带有保存点的扁平事务(Flat Transactions with Savepoints)
- 链事务(Chained Transactions)
- 嵌套事务(Nested Transactions)
- 分布式事务(Distributed transactions)
带保存点的扁平事务可以模拟嵌套事务,灵活性比较高。但是无法像嵌套事务可以并行执行子事务。
传播机制
- propagation_required:默认传播行为。方法被调用时,存在事务则加入,没有则创建
- propagation_supports:存在事务则加入,没有则不创建事务
- propagation_mandatory:存在事务则加入,没有则抛出异常
- propagation_requires_new:创建一个新的事务,调用方的事务被挂起至当前事务执行完。
- propagation_not_supported:当前方法不以事务方式运行,调用方存在事务则挂起调用方事务,然后以非事务方式运行当前方法。
- propagation_never:当前方法不以事务方式运行,调用方存在事务则抛出异常
- propagation_nested:如果调用方存在事务,则会当前方法按嵌套事务方式运行,可以单独提交或者回滚。调用方不存在事务则创建一个事务。
分三类:
- 支持当前事务,如果当前有事务,那么会加入该事务,不再单独创建事务。如果当前没有事务,则分为三种情况
- 创建事务
- 不按事务执行
- 抛出异常
- 不支持当前事务,分为三种情况。
- 自己会创建事务,允许当前存在事务。当前存在事务则挂起,运行自己的事务
- 自己不会创建事务,允许当前存在事务。当前存在事务则挂起,以非事务方式运行自己
- 自己不会创建事务,不允许当前存在事务。当前存在事务则抛出异常
- 嵌套方式,当前存在事务则创建嵌套的子任务。
总结:
三类事务:加入、挂起、嵌套
四种对调用方事务的响应:没有则创建、没有则不创建、没有则抛出异常、有则抛出异常