在Spring中,我们如何确保操作的原子性

时间:2013-06-17 06:58:14

标签: java hibernate spring-mvc

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

3 个答案:

答案 0 :(得分:1)

@Transactional(propagation = Propagation.REQUIRED 可以解决你的问题。

假设在你的Impl中有一个方法Excecute.Inside 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)时,单个trasaction对象用于所有方法,即(M1到M5)。

}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

如果其中任何一个失败,例如抛出异常,整个操作将回滚。 Spring参考文档专门用于transactions的章节,例如有关于@Transactional settingsTransaction propagation的信息。