【问题标题】:In Spring, how will we make sure the atomicity of operationsSpring中如何保证操作的原子性
【发布时间】:2013-06-17 06:58:13
【问题描述】:

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

【问题讨论】:

  • 你说的是数据库事务吗?或者你在说什么操作。如果我们不了解您的确切问题,我们很难为您提供帮助。
  • 是(1)这两个操作都是数据库事务(2)一个数据库事务,另一个是一组逻辑语句。

标签: java hibernate spring-mvc


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    @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();
    

    如果(任何方法事务中的任何错误都将回滚)。当使用@Transactional(propagation = Propagation.REQUIRED)时,所有方法都使用单个事务对象,即(M1到M5)。

    }

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 感谢@matsev 的解释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2019-09-16
      相关资源
      最近更新 更多