Spring事务的传播特性
什么是事务的传播特性?
事务的传播特性就是当一个事务方法被另外一个事务的方法调用时,这个事务该怎么处理!
Spring总共给出了7中事务的隔离级别:
可以分为三种类型 不要事物的 、 可有可无的 、 必须有事务的
不要事物的:
1.PROPAGATION_NEVER: 没有就非事务执行,如果有事务就抛异常
2.PROPAGATION_NOT_SUPPORTED: 没有就非事务执行,有就直接见事务挂起,然后非事务执行
可有可无的
3.PROPAGATION_SUPPORTED: 有事务就加入当前事务,没事务就非事物执行
必须有事务的
4.PROPAGATION_REQUIRES_NEW: 不管有没有事务都会创建一个新的事务。如果有就将原来的事务挂起,使用自己的事务。
5.PROPAGATION_NESTED: 不管有没有事务都会创建一个新的事务,如果有事务,就在当前事务中嵌套一个新的事物
6.PROPAGATION_REQUIRED: 默认事务类型,如果没有就新建一个事务;如果有,就加入当前事务。(大多数情况都是用这种)
7.PROPAGATION_MANDATORY: 如果没有事务就报错,如果有事务就加入当前事务。
注意:在这7种事物隔离级别中存在一些将原事物挂起的类型,如果使用的是将原事物挂起的隔离级别会出现的问题
假设A方法有事务对user表的一条数据进行操作,操作完过后调用B方法。
B方法也有事务,B方法的逻辑和A方法的一样对user表操作同一条数据,假设事务的隔离类型是 NOT_SUPPORTED:就会出现死锁的情况。
因为A方法调用B方法的时候 B方法把A方法的事物挂起。导致user表锁起来了。所以B方法对user表就操作不了,所以产生死锁