Grails アプリでは、サービス メソッドのデフォルトの動作はトランザクションであり、未チェックの例外がスローされた場合、トランザクションは自動的にロールバックされます。ただし、Groovy では、チェック済み例外の処理 (または再スロー) が強制されないため、サービス メソッドがチェック済み例外をスローすると、トランザクションがロールバックされないというリスクがあります。このため、すべての Grails サービス クラスに注釈を付けることが推奨されるようです。
@Transactional(rollbackFor = Throwable.class)
class MyService {
void writeSomething() {
}
}
に他のメソッドがありMyService
、そのうちの 1 つは DB を読み取るだけで、もう 1 つは 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()
は、読み取り専用トランザクションが開始されます。読み取り/書き込みトランザクションが進行中の場合、このトランザクションに参加します。