使用Spring TransactionSynchronizationManager跟踪嵌套事务

时间:2016-12-13 13:08:34

标签: spring transactions

我正在使用一个使用Sprint交易的模块

提交事务(T1)后,我想对该特定事务(T1)处理的数据采取一些操作。如果T1调用一个方法(在同一个线程中)启动了一个新的事务T2,那么我不在乎T2是否已经提交。我想只在T1提交时采取行动

Spring TransactionSynchronizationManager似乎没有解决嵌套事务(即,当该线程上运行的任何事务提交时,它会调用commit callback)。这意味着如果T2提交,T1添加的任何TransactionSynchronization也将被调用

我考虑使用提交的事务的名称(TransactionSynchronizationManager.getCurrentTransactionName()),但是如果相同的方法在同一个线程上启动多个事务,那么它将不起作用(例如,如果我们有一个方法具有{{ 1}}并且它自己调用) 注 - 在spring托管事务中,缺省事务名称是完全限定的类名,后跟方法名称

1 个答案:

答案 0 :(得分:0)

在阅读了一些Spring代码之后发现了答案(希望这是在某处记录/博客)

当Spring(p)遇到AbstractPlatformTransactionManager的事务方法时,它会挂起当前事务。

暂停期间,它会暂停并删除在交易过程中注册的所有现有TransactionDefinition.PROPAGATION_REQUIRES_NEW(请参阅TransactionSynchronization

内部交易完成后,它会将所有已暂停的交易添加/注册回AbstractPlatformTransactionManager.doSuspendSynchronization()(请参阅TransactionSynchronizationManager

这可以确保提交内部事务只调用内部事务本身添加的同步