0
如果我在使用GORM的同一线程上执行两次刷新,是否有可能在第一次通过而第二次在单独事务中失败?在同一个线程上执行两次刷新GORM
或即使我只有一个通过线程中途刷新一半,然后在请求结束后第二次隐式刷新,是否有可能第二次失败,但是显式刷新的更改可以通过并因此被持续在数据库中?
感谢
如果我在使用GORM的同一线程上执行两次刷新,是否有可能在第一次通过而第二次在单独事务中失败?在同一个线程上执行两次刷新GORM
或即使我只有一个通过线程中途刷新一半,然后在请求结束后第二次隐式刷新,是否有可能第二次失败,但是显式刷新的更改可以通过并因此被持续在数据库中?
感谢
如果我有使用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'或一个服务方法(默认是事务性的)中,你没有*任何* transactions –
正如唐提到的,如果你没有指定事务边界(通过'withTransaction或服务上的@ Transactional转换),那么你的数据库连接处于自动提交模式,并且由于没有事务存在,刷新将自动保存任何更改。 –