Stavo leggendo i diversi livelli di isolamento della transazione e ho rilevato il livello di isolamento SERIALIZABLE
. So anche che database come Postgres, Oracle e MySQL supportano la sintassi SELECT .. FOR UPDATE
.Transazioni serializzabili vs SELEZIONA PER AGGIORNAMENTO
Sono comunque confuso su come dovrebbero essere utilizzati quando desidero bloccare una riga (o un intervallo di righe) su cui desidero eseguire aggiornamenti.
Quando si utilizzava JPA in passato, ho sempre utilizzato @Transactional
insieme a LockModeType.PESSIMISTIC_WRITE
sulla query. Questo si traduce in un livello di isolamento READ_COMMITTED
con un SELECT .. FOR UPDATE
in SQL.
Ma ora, avendo letto SERIALIZABLE
, mi chiedo cosa sarebbe diverso se usato @Transactional(isolation=SERIALIZABLE)
con un normale SELECT
(es em.findById recuperare un'entità indipendente), seguito da un UPDATE
(unione della entità).
Il comportamento sarebbe lo stesso?
Ad esempio, ho un sistema di banca e desidero trasferire denaro tra due account. Ho bisogno di questi conti per non essere immischiati, mentre il trasferimento è in corso. Quindi, supponiamo di addebitare un account con -100 e accreditarlo nell'altro account. Quale sarebbe il modo migliore per garantire che questi account siano disponibili solo per la transazione che esegue l'aggiornamento?
Supponiamo che sto manipolando entità distaccate JPA, quindi prima dell'aggiornamento, dovrò leggerle dal DB, ad es. findById().
- Usa
@Transactional(isolation=READ_COMMITTED)
, em.findById conLockModeType.PESSIMISTIC_WRITE
(vale a direSELECT .. FOR UPDATE
), e poi em.merge (vale a direUPDATE
)? - OPPURE Utilizzare
@Transactional(isolation=SERIALIZABLE)
, em.findById, e quindi em.merge (cioèUPDATE
)?
"* con SERIALIZABLE tutto è sempre bloccato *" non è vero come affermazione generale. Questo dipende fortemente dall'implementazione del DBMS (ad esempio Postgres non lo fa) –
È vero che "PostgreSQL ad esempio non lo fa" in PostgreSQL serializzabile Effettua tutte le istruzioni di selezione senza Lock ma quando si verifica concorrenza alle istruzioni di scrittura l'ultima transazione ottiene fallito garantendo l'integrità serializzabile – deFreitas