【Spring 的事务-小探】

小引:
对于单个数据表更新动作,是否需要去声明事务管理呢?
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值