spring声明式事务(三)

来源:互联网 发布:卡卡西实力如何知乎 编辑:程序博客网 时间:2024/06/06 00:59


getPropagationBehavior () 返回事务的传播行为,由是否有一个活动的事务来决定一个事务调用。 在 TransactionDefinition 接口中定义了七个事务传播行为:

 

l         PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 使用 spring 声明式事务, spring 使用 AOP 来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。 单独调用 methodB 方法 相当于 Spring 保证在 methodB 方法中所有的调用都获得到一个相同的连接。在调用 methodB 时,没有一个存在的事务,所以获得一个新的连接,开启了一个新的事务。 单独调用 MethodA 时,在 MethodA 内又会调用 MethodB. 执行效果相当于 调用 MethodA 时,环境中没有事务,所以开启一个新的事务 . 当在 MethodA 中调用 MethodB 时,环境中已经有了一个事务,所以 methodB 就加入当前事务。

l         PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器, PROPAGATION_SUPPORTS 与不使用事务有少许不同。 单纯的调用 methodB 时, methodB 方法是非事务的执行的。 当调用 methdA 时 ,methodB 则加入了 methodA 的事务中 , 事务地执行。

l         PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。 当单独调用 methodB 时,因为当前没有一个活动的事务,则会抛出异常 throw new IllegalTransactionStateException("Transaction propagation ''mandatory'' but no existing transaction found"); 当调用 methodA 时, methodB 则加入到 methodA 的事务中,事务地执行。