事务的传播行为:spring
PROPAGATION_REQUIRED--支持当前事务,若是当前没有事务,就新建一个事务。这是最多见的选择。 session
PROPAGATION_SUPPORTS--支持当前事务,若是当前没有事务,就以非事务方式执行。 hibernate
PROPAGATION_MANDATORY--支持当前事务,若是当前没有事务,就抛出异常。 设计
PROPAGATION_REQUIRES_NEW--新建事务,若是当前存在事务,把当前事务挂起。 事务
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。 io
PROPAGATION_NEVER--以非事务方式执行,若是当前存在事务,则抛出异常。 配置
若是你在你的Service层的这个方法中,除了调用了Dao层的方法以外,还调用了本类的其余的Service方法,那么在调用其余的Service方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里掉用的这个方法与我自己的方法处在同一个事务中,不然若是保证事物的一致性。事务的传播特性就是解决这个问题的,“事务是会传播的”在Spring中有针对传播特性的多种配置咱们大多数状况下只用其中的一种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始建立事务,要看你的aop的配置),那么在调用这个service层里面的其余的方法的时候,若是当前方法产生了事务就用当前方法产生的事务,不然就建立一个新的事务。这个工做使由Spring来帮助咱们完成的。 aop
之前没有Spring帮助咱们完成事务的时候咱们必须本身手动的控制事务,例如当咱们项目中仅仅使用hibernate,而没有集成进spring的时候,咱们在一个service层中调用其余的业务逻辑方法,为了保证事物必须也要把当前的hibernate session传递到下一个方法中,或者采用ThreadLocal的方法,将session传递给下一个方法,其实都是一个目的。如今这个工做由spring来帮助咱们完成,就可让咱们更加的专一于咱们的业务逻辑。而不用去关心事务的问题。 service
1:PROPAGATION_REQUIRED(必须的)方法
加入当前正要执行的事务不在另一个事务里,那么就起一个新的事务好比说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么因为执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到本身已经运行在ServiceA.methodA的事务内部,就再也不起新的事务。而假如ServiceA.methodA运行的时候发现本身没有在事务中,他就会为本身分配一个事务。这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即便ServiceB.methodB的事务已经被提交,可是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚
2:PROPAGATION_SUPPORTS(支持)
若是当前在事务中,即以事务的形式运行,若是当前再也不一个事务中,那么就以非事务的形式运行
这就跟日常用的普通非事务的代码只有一点点区别了。不理这个,由于我也没有以为有什么区别
3:PROPAGATION_MANDATORY(强制性的)
必须在一个事务中运行。也就是说,他只能被一个父事务调用。不然,他就要抛出异常。
4:PROPAGATION_REQUIRES_NEW(要求)
这个就比较绕口了。 好比咱们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW,那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成之后,他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。由于ServiceB.methodB是新起一个事务,那么就是存在两个不一样的事务。若是ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。若是ServiceB.methodB失败回滚,若是他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
5:PROPAGATION_NOT_SUPPORTED (不支持)
当前不支持事务。好比ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED ,那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。
6:PROPAGATION_NEVER (从未)
不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER ,那么ServiceB.methodB就要抛出异常了。
7:PROPAGATION_NESTED (嵌套)
理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,若是父事务最后回滚,他也要回滚的。