小引:
对于单个数据表更新动作,是否需要去声明事务管理呢?
A:不需要,“原子性” ,且结果 "一致性"了 。要么成功,要么失败。
B:虽然加不加结果应该一样了,但是声明事务管理是需要消耗性能的。
便开始想,似乎都很有道理,但如果别人使用此方法去做动作,那么同类、异类、之间的使用,能否保证一致性呢?
前提,此处讨论的场景,均使用@Transational 注解声明事务管理,且默认传播级别是Required
异类方法调用情况:
① A 自身有声明事务,调用无事务方法B,无论在A 或者 B 中出现 RE 均会回滚事务;
② A 自身有声明事务,调用有事务方法B, 在 AB 事务传播级别均时Required 时,同 ①
③ A 自身无事务,调用有事务方法B,此时 A 中 的RE异常对B 无影响,B 自身出RE异常时事务能回滚;
④ A 自身无事务,调用无事务方法B;均无事务管理。
同类方法调用情况:
① A 自身有声明事务,调用无事务方法B,无论 B 是 public/private;在A 、B 中出现RE 均会回滚事务。
② A 自身有声明事务,调用有事务方法B,无论 B 是 public/private ,在 AB 事务传播级别均时Required 时,同 ①
③ A 自身无事务,调用有事务方法 B,
B 是 (非private) 方法时 A 中的RE异常对 B 无影响,B 在使用 this.B() 时事务也无效,但使用Spring 的注入对象调用B方法时,则自身事务有效;
B 是 (private) 时,则调用时,使用的是,代理对象.B(); 内部的对象全部将会注入失败;可能会导致空指针异常;(具体得参照CGLIB 实现方式,这里不展开)
④ A 自身无事务,调用无事务方法B;均无事务管理。
当然如果结合 传播级别来讨论这个是否有效的场景就会有意思,比如NOT_SUPPORT / REQUIRED_NEW ;
具体的传播级别的特性这里暂不做记录;
可参考: https://blog.csdn.net/qq_36094023/article/details/90544286
CGLIB 味道 可参考:https://www.cnblogs.com/shimmernight/p/15226505.html