Spring事务的配置
上述就是spring事务的一个简单配置,只要给方法上加上Transactional,就可以控制住这个方法,在方法出现异常的时候进行回滚操作,同时还可以设置一些参数,关于这些参数也在上图中标记出来了。
下面主要是事务隔离级别和事务传播行为的介绍
1、事务隔离级别:
数据库事务并发的三大问题:
- 脏读:事务1将变量a从1改成10 >>> 事务2读取到a的值为10 >>> 事务1出现异常,把a回滚成1 >>>事务2拿到的值a=10就是一个脏值
- 不可重复读:事务1读取的变量a为1 >>> 事务2将变量a改为 10 >>>事务1再读取a的值就变成10 >>> 两次读取到的值不同
- 幻读:事务1读取了book表的全部数据 >>> 事务2向book表插入新行 >>> 事务1再去读取book表的时候发现多出来一些行
隔离级别:
- 读未提交:可以读到其他事务未提交的数据
- 读已提交:只能读取到其他事务已提交的数据
- 可重复读:在一次事务之间读取的值是相同的
- 串行化:绝对安全,效率低下
2、事务的传播行为:
传播行为就是(事务的传播+事务的行为)
主要考虑的问题:多个事务嵌套运行,子事务是否要和大事务共用一个事务
上图中事务的传播属性常用的就是REQUIRED和REQUIRED_NEW下面举例说明:
假设有三个事务tx1、tx2、tx3
======================
第一种情况:
tx1//方法1{
tx2//方法2 REQUIRED
tx3//方法3 REQUIRED
}
因为方法2 ,和方法3事务都是设置为REQUIRED,所以现在三个方法都是同坐一船,一旦
一个方法挂了,三个方法都挂了
====================
第二种情况:
tx1//方法1{
tx2//方法2 REQUIRED_NEW
tx3//方法3 REQUIRED
}
方法2设置为REQUIRED_NEW,这个时候就相当于方法1和方法3一起坐一条船,方法2另外开一条船
这里分为两种情况:
情况1:
方法2挂了,方法1和方法3也要挂,虽然方法2开了新船,但是它会把异常抛出来到方法1和方法3的船。
情况2:
方法3挂了,方法1和3全部挂了,但这个时候不会影响到方法2,方法2自己早就开新船跑了。
===========
注,只有代理对象调用方法才能被spring事务控制