我有这样的事情:
class SomeService {
static transactional = true
def someMethod(){
...
a.save()
....
b.save()
....
c.save()
....
etc...
}
}
我想知道事务方法是否成功,我不想检查每个域对象中的error属性,因为逻辑涉及许多域类,并且很难。
答案 0 :(得分:3)
使用
a.save(failOnError: true)
b.save(failOnError: true)
c.save(failOnError: true)
d.save(failOnError: true)
我假设您想要的是在单个域保存错误时抛出异常的服务,并在这种情况下回滚事务。
答案 1 :(得分:2)
您可以通过多种方式查看相同内容: -
由于您不想跟踪服务类中的所有saves
,我猜您也不想跟踪每个保存以设置failOnError
标志。替代方法是在grails.gorm.failOnError=true
中设置Config.groovy
,它会自动检查每个保存并在域类验证失败的情况下抛出ValidationException
。 ValidationException
是RuntimeException
因此,如果抛出一个事务,将回滚事务。看看failOnError就可以了解这个想法。
(在您的情况下稍微冗长)Save方法在成功的情况下返回域对象本身,否则在验证失败时返回null。您再次跟踪所有saves
以检查if(a.save()){...}
,if(b.save()){...}
,等等,等等......
(我认为合适的方法)将使用TransactionAspectSupport
来获取事务状态并检查它是否设置为仅回滚。如果不是那么你就是好人。
例如:
def someMethod(){
try{
...
a.save()
....
b.save()
....
c.save()
....
etc...
}catch(e){
//It can also be used as a last line in method instead of checking
//in catch block.
println TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()
}
//println TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()
}