一,Spring事务隔离级别
Spring事务隔离级别是按照数据库的隔离级别来定义的,即也包括读未提交,读提交,可重复读,串行化这四种;
如果没有设置也是按照数据库底层默认隔离级别来的,mysql默认隔离级别是可重复读,sqlserver和oracle默认隔离级别是读提交。
二,Spring事务传播行为
Spring中事务传播行为是指一个方法调用另一个方法,期间的事务属性怎么传播的问题。具体举例如下:
ServiceA{
void serviceA(){
doSomeThing;
serviceB.serviceB();
doSomeThing;
}
}
ServiceB{
void serviceB(){
doSomeThing;
}
}
2.1,PROPAGATION_REQUIRED(支持当前事务,假设当前没有事务,就新建一个事务;默认的选择)
serviceB设置事务传播行为为PROPAGATION_REQUIRED
如果serviceA方法在事务T1中,则serviceB就也在事务T1中运行;
如果serviceA方法没有在事务中,则serviceB就新开启一个事务运行;
2.2,PROPAGATION_SUPPORTS(支持当前事务;假如当前没有事务就以非事务方式运行)
serviceB设置事务传播行为为PROPAGATION_SUPPORTS;
如果serviceA方法在事务T1中运行,则serviceB也放在事务T1中运行;
如果serviceA方法没有在事务中,则serviceB也按照非事务方式运行;
2.3,PROPAGATION_MANDATORY(支持当前事务;假如当前没有事务就抛出异常)
serviceB设置事务传播行为为PROPAGATION_MANDATORY,表示serviceB必须在事务中运行;
如果serviceA方法在事务T1中运行,则serviceB也放在事务T1中运行;
如果serviceA方法没有在事务中,则serviceB抛出异常;
2.4,PROPAGATION_REQUIRES_NEW(新建事务;假如当前存在事务则把当前事务挂起)
serviceB设置事务传播行为为PROPAGATION_REQUIRES_NEW,表示serviceB需要新开启一个事务运行;
如果serviceA方法在事务T1中运行,则事务T1挂起,serviceB新起一个事务运行;
如果serviceA方法没有在事务中,则serviceB新起一个事务运行;
这里需要注意的是serviceA和serviceB抛异常的情况,这个具体在方法里面控制就可以了。
2.5,PROPAGATION_NOT_SUPPORTED(以非事务方式运行;假如当前存在事务就把当前事务挂起)
serviceB设置事务传播行为为PROPAGATION_NOT_SUPPORTED,表示serviceB以非事务方式运行;
如果serviceA方法在事务T1中运行,则事务T1挂起,serviceB以非事务方式运行;
如果serviceA方法没有在事务中,则serviceB以非事务方式运行;
2.6,PROPAGATION_NEVER(以非事务方式运行;假如当前存在事务则抛出异常)
serviceB设置事务传播行为为PROPAGATION_NEVER,表示serviceB以非事务方式运行;
如果serviceA方法在事务T1中运行,则抛异常;
如果serviceA方法没有在事务中,则serviceB以非事务方式运行;
2.7,PROPAGATION_NESTED
和PROPAGATION_REQUIRES_NEW的区别是PROPAGATION_REQUIRES_NEW另起一个事务运行,他的提交和serviceA方法的事务提交是独立的;
serviceB的事务和serviceA的事务是相依的,serviceB的提交要等和serviceA一起提交;