2014-04-16 15 views
0

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

或即使我只有一个通过线程中途刷新一半,然后在请求结束后第二次隐式刷新,是否有可能第二次失败,但是显式刷新的更改可以通过并因此被持续在数据库中?

感谢

回答

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') 
    } 
    } 
} 
+0

因此,如果我不使用withTransaction而是多次调用flush,这一切仍然定义为一个原子事务吗? –

+0

如果你没有把你的代码放在'withTransaction'或一个服务方法(默认是事务性的)中,你没有*任何* transactions –

+1

正如唐提到的,如果你没有指定事务边界(通过'withTransaction或服务上的@ Transactional转换),那么你的数据库连接处于自动提交模式,并且由于没有事务存在,刷新将自动保存任何更改。 –

相关问题