2010-07-28 68 views
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:声明式事务

  1. ExtHotelApiService延伸HotelApiService
  2. RollBackError延伸的RuntimeException
  3. ExtHotelApiService.transactional = 真正
  4. HotelApiService.transactional =
  5. 我们必须保存酒店,然后才保存描述
  6. 我们必须回滚事务(而不是持续的酒店)如果说明是无效的(不能坚持)

所有的代码是根据Declarative Transactions guide写的,但有一个麻烦 - 根本不会发生回滚! :(

事务成功提交和酒店一直持续到DB RollBackError被抛出后也!

在那里我有犯错以及如何与声明式事务在正确的方式工作?

回答

1

为Spring的默认行为声明式事务管理告诉事务管理器回滚任何未检查的异常,并忽略任何检查的异常。可以声明检查异常以触发回滚,但如果默认@Transactional设置保持不变,则检查的异常不会有任何对当前交易的影响

有关此的Spring文档可用于here,相关章节为10.5.5和10.5.6。特别注意以下几点:

任何RuntimeException的触发 回滚,但是任何checked异常 没有。

+0

RollBackError是RuntimeException,它仍然忽略它,即使我将RollBackError.class作为rollBackFor参数传递。我只是不明白 - 我在这种情况下检查异常,但即使检查异常可以触发回滚,如果他们作为rollBackFor参数根据文档传递,但是...不在我的情况下:( – Oleksandr 2010-07-28 20:01:24

+0

如果它是一个RuntimeException,那么为什么你将它包含在你的方法声明中?(不是说这与问题有关,但是好奇) – Fil 2010-07-28 20:10:23

+0

Grails文档的另一点警告:依赖注入是声明性事务处理的唯一方式。一个事务服务,如果你使用新的运算符,如新的BookService() – Fil 2010-07-28 20:16:06