4

在 Spring 中,我们如何确保某些操作总是一起执行。如果其中任何一个失败,则需要回滚整个事务。我对此进行了很多搜索,发现了与我的问题接近的@Transactional(propagation = Propagation.REQUIRED)注释和方法。TransactionTemplate.execute()请澄清和帮助。

4

3 回答 3

1

@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)。

}

于 2013-06-17T07:39:58.983 回答
1

@Transactional 和 TransactionTemplate 都确保原子性。@Transactional 用于声明式事务管理,TransactionTemplate 用于编程式事务管理。你应该选择一个。

事务传播的思想仅适用于声明式事务管理,并定义了在多个方法中执行时的事务行为。请注意,Propagation.REQUIRED 是 Transactional.propagation 的默认值。这意味着支持当前事务(即如果一个事务已经在调用方法中启动)或者如果不存在则创建一个新事务

于 2013-06-17T09:04:14.580 回答
0

您可以创建一个委托给两个数据库调用的方法,并用 注释它@Transactional,例如

@Transactional
public void atomicOperation(...) {
    dbCall();
    logicOperation();
}

如果任何一个失败,例如抛出异常,整个操作将回滚。Spring 参考文档专门有一章介绍事务,例如有关于@Transactional 设置事务传播的信息。

于 2013-06-17T09:17:30.123 回答