Dón*_*nal 6 grails groovy spring transactions spring-transactions
在Grails应用程序中,服务方法的默认行为是它们是事务性的,如果抛出未经检查的异常,事务将自动回滚.但是,在Groovy中,不会强制处理(或重新抛出)已检查的异常,因此存在一种风险,即如果服务方法抛出已检查的异常,则不会回滚该事务.考虑到这一点,似乎建议注释每个Grails服务类
@Transactional(rollbackFor = Throwable.class)
class MyService {
void writeSomething() {
}
}
Run Code Online (Sandbox Code Playgroud)
假设我有其他方法MyService,其中一个只读取数据库,另一个不接触数据库,以下注释是否正确?
@Transactional(readOnly = true)
void readSomething() {}
// Maybe this should be propagation = Propagation.NOT_SUPPORTED instead?
@Transactional(propagation = Propagation.SUPPORTS)
void dontReadOrWrite() {}
Run Code Online (Sandbox Code Playgroud)
为了回答这个问题,我想你需要知道我的意图是什么:
writeSomething()调用dontReadOrWrite()和后者抛出异常,前者启动的事务将被回滚.我假设rollbackFor类级别属性是由各个方法继承的,除非它们明确地覆盖它.dontReadOrWritereadSomething()调用时没有正在进行的事务,则将启动只读事务.如果正在进行读写事务,它将参与此事务.我认为您正在寻找的是更精细的事务管理,而使用 @Transactional 注释是正确的方向。也就是说,有一个Grails 事务处理插件可以为您提供您正在寻找的行为。需要注意的是,您需要将服务方法调用包装在 DomainClass.withTransaction 闭包中,并将您正在寻找的非标准行为作为参数映射提供给 withTransaction() 方法。
请注意,在后端,这正是您上面所说的,通过使用 @Transactional 注释来更改运行时事务的行为。该插件文档非常出色,因此我认为您不会发现自己没有足够的指导。
希望这就是您正在寻找的。
| 归档时间: |
|
| 查看次数: |
4680 次 |
| 最近记录: |