在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()
時,一個只讀事務將會啓動。如果正在進行讀寫事務,它將參與此事務。