Grails:声明性交易

时间:2010-07-28 16:10:41

标签: spring grails transactions

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 */
}
}

注意事项:

  1. ExtHotelApiService扩展 HotelApiService
  2. RollBackError扩展 RuntimeException
  3. ExtHotelApiService.transactional = true
  4. HotelApiService.transactional = false
  5. 我们必须保存酒店,然后才保存说明
  6. 如果描述无效(无法保留),我们必须回滚交易(而不是坚持酒店)
  7. 所有代码都是根据Declarative Transactions guide编写的,但有一个问题 - 根本没有回滚! :(

    交易成功提交,即使抛出RollBackError,酒店也会持久存入数据库!

    我犯了错误以及如何以正确的方式处理声明性交易?

1 个答案:

答案 0 :(得分:1)

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

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

  

任何RuntimeException触发器   回滚,以及任何已检查的异常   没有。