【问题标题】:Two flushes on the same thread GORM同一线程 GORM 上的两次刷新
【发布时间】:2014-05-30 21:10:20
【问题描述】:

如果我使用 GORM 在同一个线程上进行两次刷新,是否有可能在单独的事务中第一次通过而第二次失败?

或者即使我只是在线程中途进行了一次刷新,然后在请求完成后进行了第二次隐式刷新,第二次是否有可能失败,但来自显式刷新的更改通过并因此被持久化数据库?

谢谢

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    如果我使用 GORM 在同一个线程上进行两次刷新,是否有可能在单独的事务中第一次通过而第二次失败?

    成功/失败的是事务,而不是刷新。在每个事务结束时以及每个会话(请求)结束时都有一个隐式刷新。在同一个线程中绝对有可能有多个事务,其中一些失败,一些成功。例如,给定一个简单的域类

    class Book {
      String title
    }
    

    someAction 中的第一个事务将成功,第二个事务将回滚。

    class MyController {
    
      def someAction() {
    
        Book.withTransaction {
          new Book().save(title: 'successful').save(failOnError: true)
        }
    
        Book.withTransaction {
          new Book().save(title: 'failed').save(failOnError: true)
          throw new RuntimeException('transaction rollback')
        }
      }
    }
    

    【讨论】:

    • 那么,如果我不使用 withTransaction 而是多次调用flush,它是否仍然是一个原子事务?
    • 如果您没有将代码放入withTransaction 或服务方法(默认情况下是事务性的),那么您就没有任何个事务
    • 正如 Don 提到的,如果您不指定事务边界(通过 withTransaction 或服务上的 @Transactional 转换),那么您的数据库连接处于自动提交模式,刷新将保存任何由于不存在交易而自动更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    相关资源
    最近更新 更多