实现声明性事务的问题

时间:2010-07-29 05:54:29

标签: grails transactions declarative

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

  

class MyService {

     

static transactional = false

     

@Transactional(readOnly = false,   传播=   Propagation.REQUIRES_NEW)

     

public def saveCountry(){Country co =   新国家(姓名:'mycountry')   co.save()createState()

     

}

     

@Transactional(readOnly = false,   传播=   Propagation.REQUIRES_NEW)

     

public def createState(){       州州=新州(名称:'州')       state.save()抛出新的RuntimeException()       }}

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

已撤消的国家/地区对象未被撤销。虽然我已经给出了注释,但它们没有产生预期的效果。单笔交易 在这里创建,抛出异常时它被撤销。没有保存对象。

任何人都可以提供帮助

1 个答案:

答案 0 :(得分: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
    }  
}

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