我正在使用一个使用Sprint交易的模块
提交事务(T1)后,我想对该特定事务(T1)处理的数据采取一些操作。如果T1调用一个方法(在同一个线程中)启动了一个新的事务T2,那么我不在乎T2是否已经提交。我想只在T1提交时采取行动
Spring TransactionSynchronizationManager
似乎没有解决嵌套事务(即,当该线程上运行的任何事务提交时,它会调用commit callback)。这意味着如果T2提交,T1添加的任何TransactionSynchronization
也将被调用
我考虑使用提交的事务的名称(TransactionSynchronizationManager.getCurrentTransactionName())
,但是如果相同的方法在同一个线程上启动多个事务,那么它将不起作用(例如,如果我们有一个方法具有{{ 1}}并且它自己调用)
注 - 在spring托管事务中,缺省事务名称是完全限定的类名,后跟方法名称
答案 0 :(得分:0)
在阅读了一些Spring代码之后发现了答案(希望这是在某处记录/博客)
当Spring(p
)遇到AbstractPlatformTransactionManager
的事务方法时,它会挂起当前事务。
暂停期间,它会暂停并删除在交易过程中注册的所有现有TransactionDefinition.PROPAGATION_REQUIRES_NEW
(请参阅TransactionSynchronization
)
内部交易完成后,它会将所有已暂停的交易添加/注册回AbstractPlatformTransactionManager.doSuspendSynchronization()
(请参阅TransactionSynchronizationManager
)
这可以确保提交内部事务只调用内部事务本身添加的同步