【发布时间】:2014-05-30 21:10:20
【问题描述】:
如果我使用 GORM 在同一个线程上进行两次刷新,是否有可能在单独的事务中第一次通过而第二次失败?
或者即使我只是在线程中途进行了一次刷新,然后在请求完成后进行了第二次隐式刷新,第二次是否有可能失败,但来自显式刷新的更改通过并因此被持久化数据库?
谢谢
【问题讨论】:
标签: grails grails-orm
如果我使用 GORM 在同一个线程上进行两次刷新,是否有可能在单独的事务中第一次通过而第二次失败?
或者即使我只是在线程中途进行了一次刷新,然后在请求完成后进行了第二次隐式刷新,第二次是否有可能失败,但来自显式刷新的更改通过并因此被持久化数据库?
谢谢
【问题讨论】:
标签: grails grails-orm
如果我使用 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 或服务方法(默认情况下是事务性的),那么您就没有任何个事务
withTransaction 或服务上的 @Transactional 转换),那么您的数据库连接处于自动提交模式,刷新将保存任何由于不存在交易而自动更改。