代码之家  ›  专栏  ›  技术社区  ›  Miguel Ping

Grails1.2.0-强制服务回滚

  •  2
  • Miguel Ping  · 技术社区  · 16 年前

    我有一个调用其他实用程序类的服务类。这些班级有时也会自己上课 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()
    

    从我的服务方法中的实用程序类

    这样地:

    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 回复  |  直到 16 年前
        1
  •  3
  •   Burt Beckwith    16 年前

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

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