DEV Community

warldge
warldge

Posted on • Edited on

spring特殊的事务隔离性

TransactionDefinition.PROPAGATION_NESTED
内部中只设置savepoint,并没有真正独立的commit。
效果:内层抛异常,则内层回滚,不影响外层继续执行;内层之后的外层如果抛异常,则连带内层一起回滚。

示例:
TransactionTemplate tt = new TransactionTemplate(ptm);
tt.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED);
String exeRst = tt.execute( new TransactionCallback() {。。。

此时内部不能使用transactionStatus.setRollbackOnly()进行显示回滚,这会使外部事务也整体回滚;
而要用抛异常或platformTransactionManager.rollback(nestedStatus)来只回滚到savepoint。

spring配置文件DataSourceTransactionManager内部加:

<property name="nestedTransactionAllowed" value="true"/>

或:
dataSourceTransactionManager.setNestedTransactionAllowed(true);

Enter fullscreen mode Exit fullscreen mode

Top comments (0)