在 Spring 中,我们如何确保某些操作总是一起执行。如果其中任何一个失败,则需要回滚整个事务。我对此进行了很多搜索,发现了与我的问题接近的@Transactional(propagation = Propagation.REQUIRED)
注释和方法。TransactionTemplate.execute()
请澄清和帮助。
3 回答
@Transactional(propagation = Propagation.REQUIRED 可以解决你的问题。
假设在您的 Impl 中有一个方法 Excecute。在 Excecute 方法中还有其他M1()、M2()、M3()、M4()、M5()方法。
可能你想说如果 M1(),M2().M3().M4() 方法 Db 操作成功,最后 M5() 它抛出一些异常然后 M1() 到 M5() 所有 db 操作应该回滚
Execute(){
M1();
M2();
M3();
M4();
M5();
if(任何方法事务中的任何错误都将回滚)。当使用 @Transactional(propagation = Propagation.REQUIRED) 时,所有方法都使用单个事务对象,即(M1 到 M5)。
}
@Transactional 和 TransactionTemplate 都确保原子性。@Transactional 用于声明式事务管理,TransactionTemplate 用于编程式事务管理。你应该选择一个。
事务传播的思想仅适用于声明式事务管理,并定义了在多个方法中执行时的事务行为。请注意,Propagation.REQUIRED 是 Transactional.propagation 的默认值。这意味着支持当前事务(即如果一个事务已经在调用方法中启动)或者如果不存在则创建一个新事务。
您可以创建一个委托给两个数据库调用的方法,并用 注释它@Transactional
,例如
@Transactional
public void atomicOperation(...) {
dbCall();
logicOperation();
}
如果任何一个失败,例如抛出异常,整个操作将回滚。Spring 参考文档专门有一章介绍事务,例如有关于@Transactional 设置和事务传播的信息。