0
class ExtHotelApiService extends HotelApiService {
static scope = "singleton"
static transactional = true
def save(params) {
params.hotels.each{ht->
try{
transactionalSave(ht)
} catch(Exception e) {
/* exceptions handling */
}
}
}
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW, rollBackFor=RollBackError.class)
def transactionalSave(ht) throws RollBackError {
/* saving hotel and hotel description */
}
}
注意几件事情:的Grails:声明式事务
- ExtHotelApiService延伸HotelApiService
- RollBackError延伸的RuntimeException
- ExtHotelApiService.transactional = 真正
- HotelApiService.transactional = 假
- 我们必须保存酒店,然后才保存描述
- 我们必须回滚事务(而不是持续的酒店)如果说明是无效的(不能坚持)
所有的代码是根据Declarative Transactions guide写的,但有一个麻烦 - 根本不会发生回滚! :(
事务成功提交和酒店一直持续到DB RollBackError被抛出后也!
在那里我有犯错以及如何与声明式事务在正确的方式工作?
RollBackError是RuntimeException,它仍然忽略它,即使我将RollBackError.class作为rollBackFor参数传递。我只是不明白 - 我在这种情况下检查异常,但即使检查异常可以触发回滚,如果他们作为rollBackFor参数根据文档传递,但是...不在我的情况下:( – Oleksandr 2010-07-28 20:01:24
如果它是一个RuntimeException,那么为什么你将它包含在你的方法声明中?(不是说这与问题有关,但是好奇) – Fil 2010-07-28 20:10:23
Grails文档的另一点警告:依赖注入是声明性事务处理的唯一方式。一个事务服务,如果你使用新的运算符,如新的BookService() – Fil 2010-07-28 20:16:06