l PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常 单独调用 methodB ,则非事务的执行。 调用 methodA 则会抛出异常
l PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中 . 如果没有活动事务 , 则按 TransactionDefinition.PROPAGATION_REQUIRED 属性执行 这是一个嵌套事务 , 使用 JDBC 3.0 驱动时 , 仅仅支持 DataSourceTransactionManager 作为事务管理器。需要 JDBC 驱动的 java.sql.Savepoint 类。有一些 JTA 的事务管理器实现可能也提供了同样的功能。 使用 PROPAGATION_NESTED ,还需要把 PlatformTransactionManager 的 nestedTransactionAllowed 属性设为 true; 而 nestedTransactionAllowed 属性值默认为 false; 如果单独调用 methodB 方法,则按 REQUIRED 属性执行。 如果调用 methodA 方法,相当于下面的效果 当 methodB 方法调用之前,调用 setSavepoint 方法,保存当前的状态到 savepoint 。如果 methodB 方法调用失败,则恢复到之前保存的状态。但是需要注意的是,这时的事务并没有进行提交,如果后续的代码 (doSomeThingB() 方法 ) 调用失败,则回滚包括 methodB 方法的所有操作。 嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。