spring的事物

DataSourceTansactionManager

Spring与JdbcTemplate或MyBatis框架集成时,提供的事务管理器.

事物的特性:原子性,一致性,隔离性,持久性

int TRANSACTION_READ_UNCOMMITTED = 1;  未提交读
int TRANSACTION_READ_COMMITTED   = 2;  已提交读
int TRANSACTION_REPEATABLE_READ  = 4; 重复读
int TRANSACTION_SERIALIZABLE     = 8; 序列化/不可并发


rollbackFor=Exception.class 设置遇到指定的异常类型进行回滚事务,readOnly=true
一般查询数据时需要设置为true,数据库底层会对查询进行优化处理,提高查询效率.

事物的传播行为

propagation=Propagation.REQUIRED  为默认值,表示一个方法被调用时,如果已经存在一个事务中则加入这个事务,否则,开启一个新事务;

propagation=Propagation.REQUIRES_NEW表示一个方法被调用时,不管调用的方法是否存在事务,被调用方法总为自己开启一个新的事务.

关于A方法调用B方法

总结
1、如果只有A加@Transactional注解;则AB在同一事务中;
2、如果只有B加@Transactional注解;AB方法为同一类,事务失效;AB不同类,只有B有事务

原理:
spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的
此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。

那回到一开始的问题,我们调用的方法A不带注解,因此代理类不开事务,而是直接调用目标对象的方法。当进入目标对象的方法后,执行的上下文已经变成目标对象本身了,因为目标对象的代码是我们自己写的,和事务没有半毛钱关系,此时你再调用带注解的方法,照样没有事务,只是一个普通的方法调用而已。
简单来说,内部调用本类方法,不会再走代理了,所以B的事务不起作用。

如果AB不同类,A调用的事代理类B,故B有事务。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值