Grails 1.2.0 - 强制服务回滚

时间:2010-02-10 18:42:08

标签: java grails transactions service

我有一个调用其他实用程序类的服务类。这些课本身有时 保存域对象并刷新它们(例如:new User(...).save(flush:true))。我正在通过测试调用我的服务类。

我的服务是否有交易?

从我在日志中看到的情况来看,冲洗模式总是在变化:

impl.SessionImpl setting flush mode to: MANUAL
hibernate.SQL select this_.id as i...
type.StringType binding '1rAdPVixha' to parameter
....
impl.SessionImpl setting flush mode to: AUTO

但我真正的问题是:如果我的服务方法在服务外部调用时是事务性的(例如:在测试中),我该如何强制服务回滚所有数据?


编辑:我发现了这个:

TransactionAspectSupport.currentTransactionInfo().transactionStatus.setRollbackOnly()

但是我仍然想知道我的服务是否完全是事务性的,即,即使我从我的服务方法中的实用程序类调用domain.save(flush:true),它也会在相同的tx背景。

像这样:

void testSomething() {
 svc.process(data);
 assert data.exists() ;// true if no rollback happened
}

class MySvc() {
  void process(data) {
    myUtil.process(data);
   }
}

class MyUtil {
  void process(data) { data.save(flush:true)}
}

1 个答案:

答案 0 :(得分:3)

事务绑定到线程,并假设每个事务方法都具有默认的“required”传播设置,辅助调用将加入活动事务。启动调用将在完成时提交,除非某些内容触发回滚(运行时异常或显式调用)。

请记住,flush与commit不同。事务方法会在连接上将autocommit设置为false,因此刷新会将数据推送到数据库,但是如果需要回滚,它将保留在临时事务队列中。您可以多次刷新,例如,如果您正在执行许多插入并希望减少应用程序内存使用量。提交数据库时,将使临时更改成为永久更改。