事务的传播特性可以通过@Transactional的propagation属性指定
例:
@Transactional(propagation=Propagation.REUIRED)
REQUIRED:默认的传播特性,业务方法需要在一个事务中运行,如果一个方法处在事务中那么就会加入这个事务,否则就会创建一个事务。
NEVER:指定的业务方法绝对不能在事务范围内运行,如果业务方法在某个事务中执行,就会抛出异常。
MANDATORY:该属性知道的业务方法只能在一个已经存在的事务中执行,业务方法不能自己发起自己的事务,如果业务方法不存在事务,容器抛异常,与NEVER相反的。
SUPPORTS:如果业务方法中已经在某个事务中被调用,则方法成为事务的一部分,如果外部业务方法没有开启事务,supports该方法也会在没有事务的环境中执行。
NOT_SUPPORTED:如果该业务方法在一个事务中被调用,那么当前事务会被挂起,执行该业务方法,方法执行完毕唤醒被挂起的事务,如果业务方法不在一个事务中执行,该方法也不会开事务,不管是否在有无事务的环境中执行都不开启事务。
REQUIRES_NEW:不管是否存在事务,业务方法总会自己开启一个事务,如果在已有事务的环境中调用,也有事务会被挂起,新的事务会被创建,直到业务方法调用结束,也有事务才被唤醒,内外事务不受影响。
NESTED:如果业务方法在一个事务内执行,就会新建一个保存点,然后开启一个新事务执行,如果没有事务就按着required执行,开启单独的事务,当内部发生异常时会回滚到保存点,对外部没有影响,如果外部发送异常,则内部和外部都会回滚。