Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-08177:impossibile serializzare l'accesso per questa transazione

Stai utilizzando una transazione serializzabile che attende qualche altra transazione che blocca la stessa tabella su ROLLBACK .

Se quest'altra transazione non esegue il rollback ma viene invece eseguita il commit, riceverai questo errore.

Lo scenario sembra essere il seguente:

  1. Alice apre la sua sessione del browser che chiama DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob apre la sua sessione che chiama DELETE FROM TABLE1 WHERE Version = 'v1' dopo Alice l'ha fatto ma prima che si impegnasse.

    Bob La transazione è in attesa da Alice bloccato le righe con Version = 'v1'

    • Alice commette la sua transazione

    • Bob La transazione di ' non riesce con Cannot serialize access

Per ovviare a questo problema, imposta TRANSACTION ISOLATION LEVEL a READ COMMITTED :

transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

In questo caso, Bob la richiesta di ' sarà riemessa dopo Alice esegue il commit delle modifiche, come se Bob la transazione è stata avviata dopo Alice quello è stato commesso.

Aggiorna

Potresti postare una traccia della tua connessione?

Per fare ciò, emetti questo comando subito dopo la connessione:

(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();

, quindi cerca in $ORACLE_HOME\admin\udump per un nuovo *.trc file