【发布时间】:2012-01-23 10:47:47
【问题描述】:
在 Grails 应用程序中,服务方法的默认行为是它们是事务性的,如果抛出未经检查的异常,事务会自动回滚。但是,在 Groovy 中,不会强制处理(或重新抛出)受检异常,因此存在如果服务方法抛出受检异常,事务将不会回滚的风险。鉴于此,注释每个 Grails 服务类似乎是可取的
@Transactional(rollbackFor = Throwable.class)
class MyService {
void writeSomething() {
}
}
假设我在MyService中有其他方法,其中一个只读取DB,另一个不接触DB,下面的注解是否正确?
@Transactional(readOnly = true)
void readSomething() {}
// Maybe this should be propagation = Propagation.NOT_SUPPORTED instead?
@Transactional(propagation = Propagation.SUPPORTS)
void dontReadOrWrite() {}
为了回答这个问题,我想你需要知道我的意图是什么:
- 如果任何方法抛出异常并且有一个事务正在进行,它将被回滚。例如
writeSomething()调用dontReadOrWrite(),后者抛出异常,则前者启动的事务将被回滚。我假设rollbackFor类级别属性由各个方法继承,除非它们显式覆盖它。 - 如果没有事务在进行,
dontReadOrWrite等方法将不会启动一个事务 - 如果在调用
readSomething()时没有正在进行的事务,则会启动一个只读事务。如果一个读写事务正在进行,它将参与这个事务。
【问题讨论】:
标签: spring grails groovy transactions spring-transactions