我想在功能级别实现事务控制。我想要的是这样的。
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()失败,
已撤消的国家/地区对象未被撤销。虽然我已经给出了注释,但它们没有产生预期的效果。单笔交易 在这里创建,抛出异常时它被撤销。没有保存对象。
任何人都可以提供帮助
答案 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
}
}
在这种情况下,国家/地区将被保存,但州的交易将被回滚