In un'applicazione Grails, il comportamento predefinito dei metodi di servizio è che sono transazionali e che la transazione viene automaticamente ripristinata se viene generata un'eccezione non controllata. Tuttavia, in Groovy uno non è obbligato a gestire (o ripensare) le eccezioni controllate, quindi c'è il rischio che se un metodo di servizio genera un'eccezione controllata, la transazione non verrà ripristinata. A causa di questo, sembra opportuno annotare ogni Grails classe di servizioComportamento transazione servizio Grails
@Transactional(rollbackFor = Throwable.class)
class MyService {
void writeSomething() {
}
}
Si supponga che ho altri metodi in MyService
, uno dei quali legge solo il DB, e l'altro non toccare il DB, sono i seguenti annotazioni corrette?
@Transactional(readOnly = true)
void readSomething() {}
// Maybe this should be propagation = Propagation.NOT_SUPPORTED instead?
@Transactional(propagation = Propagation.SUPPORTS)
void dontReadOrWrite() {}
Al fine di rispondere a questa domanda, credo che avrete bisogno di sapere che cosa la mia intenzione è:
- Se viene generata un'eccezione da qualsiasi metodo e c'è una transazione in corso, sarà essere tirato indietro. Ad esempio, se
writeSomething()
chiamadontReadOrWrite()
e un'eccezione viene generata da quest'ultimo, la transazione avviata dal primo verrà ripristinata. Suppongo che l'attributo a livello di classerollbackFor
sia ereditato dai singoli metodi a meno che non lo sovrascrivano esplicitamente. - Se c'è nessuna transazione in corso, non viene avviata per metodi come
dontReadOrWrite
- Se nessuna transazione è in corso quando
readSomething()
si chiama, sarà avviata una transazione di sola lettura. Se è in corso una transazione in lettura/scrittura, parteciperà a questa transazione.