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