Spring事务的1+3种实现方式、7种传播行为、4种隔离级别:
1)编程式事务管理:调用beginTransaction()、commit()、rollback()等事务管理相关的方法
2)声明式事务管理:基于TransactionProxyFactoryBean的声明式事务管理:–很少使用
3)声明式事务管理:基于AspectAOP声明式事务管理:–常使用
4)声明式事务管理:基于注解@Transaction的声明式事务管理:–经常使用
1)propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。Spring默认的事务传播行为
2)propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
3)propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
4)propagation_required_new:新建事务,如果当前事务存在,把当前事务挂起。
5)propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6)propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
7)propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。
注:Spring事务的嵌套解析—-Spring的事务传播策略在内部方法调用时将不起作用
Spring的事务传播策略在两个不同的Service调用时会起作用
class ServiceA {
void methodA() {ServiceB.methodB();}
}
class ServiceB {
void methodB() {… }
}
如果ServiceA.methodA已经起了事务,调用ServiceB.methodB时,B不新起事务,如果A没有事务,则B新建一个事务,B回滚A也回滚。
1)读未提交:T1读取T2未提交的东西,会出现脏读,不可重复读,幻读
2)读已提交:mysql默认,会出现不可重复读和幻读
3)可重复读:针对的是update操作,但是会出现幻读现象,幻读针对的是insert操作
4)串行化:解决了脏读、不可重复读和幻读,但是效率比较低