6

我想在功能级别实现事务控制。我想要的是这样的。

类我的服务{

静态事务 = 假

@Transactional(只读 = 假,传播 = Propagation.REQUIRES_NEW)

public def saveCountry(){ Country co = new Country(name:'mycountry') co.save() createState()

}

@Transactional(只读 = 假,传播 = Propagation.REQUIRES_NEW)

public def createState(){ State state = new State(name:'state') state.save() throw new RuntimeException() } }

我想要的是 createState() 创建一个独立于 saveCountry() 的新事务,这样如果 createState() 失败,

已保存的国家对象不会被撤销。虽然我已经给出了注释,但它们并没有产生预期的效果。此处创建单个事务,抛出异常时将其撤销。不保存任何对象。

谁能帮忙

4

1 回答 1

1

我不建议采用这种方法。当您到达 createState() 方法时,如果没有可用的事务,grails 将在创建新事务之前尝试使用任何打开的事务。

相反,我只会使用仅围绕必要的 grails 代码的小型事务块,而不是尝试将方法声明为事务性的

http://www.grails.org/doc/1.3.x/ref/Domain%20Classes/withTransaction.html

例如,我可以在任何地方都有一个块,例如

State.withTransaction { status -> 
   //all the code in here has an explicit transaction   
}

此事务在块结束时刷新或回滚,并且事务具有对 spring 对象 TransactionStatus 的引用。这为您提供了对错误处理的精细控制。这将允许您拥有大的交易块,但仍决定交易何时何地结束。

我会将代码更改为

public def saveCountry() {
    Country.withTransaction { status ->
        Country co = new Country(name:'mycountry')
        co.save()
    }
    createState()
}

public def createState(){
    State.withTransaction { status ->
        State state = new State(name:'state')
        state.save()
        throw new Exception
    }  
}

在这种情况下,国家将被保存,但国家的交易将被回滚

于 2010-07-31T11:25:52.310 回答