在 Grails 应用程序中,服务方法的默认行为是它们是事务性的,如果抛出未经检查的异常,事务会自动回滚。但是,在 Groovy 中,不会强制处理(或重新抛出)受检异常,因此存在如果服务方法抛出受检异常,事务将不会回滚的风险。鉴于此,注释每个 Grails 服务类似乎是可取的
@Transactional(rollbackFor = Throwable.class)
class MyService {
void writeSomething() {
}
}
假设我有其他方法MyService
,其中一个只读取数据库,另一个不接触数据库,以下注释是否正确?
@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()
,将启动一个只读事务。如果一个读写事务正在进行,它将参与这个事务。