【发布时间】:2010-07-28 16:10:40
【问题描述】:
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 */
}
}
注意几点:
- ExtHotelApiService 扩展了 HotelApiService
- RollBackError 扩展 RuntimeException
- ExtHotelApiService.transactional = 真
- HotelApiService.transactional = 假
- 我们必须保存酒店,然后才保存描述
- 如果描述无效(无法持久化),我们必须回滚交易(而不是持久化酒店)
所有代码都是根据Declarative Transactions guide 编写的,但有一个问题——根本没有发生回滚! :(
事务成功提交,即使在抛出 RollBackError 后,酒店也被持久化到数据库中!
我在哪里犯了错误以及如何以正确的方式处理声明性事务?
【问题讨论】:
标签: spring grails transactions