sql >> Databasteknik >  >> RDS >> Oracle

ORA-08177:kan inte serialisera åtkomst för denna transaktion

Du använder en serialiserbar transaktion som väntar på att någon annan transaktion låser samma tabell för att ROLLBACK .

Om den här andra transaktionen inte återställs utan commits istället får du det här felet.

Scenariot verkar vara följande:

  1. Alice öppnar hennes webbläsarsession som anropar DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob öppnar sin session som anropar DELETE FROM TABLE1 WHERE Version = 'v1' efter Alice gjorde det men innan hon begick sig.

    Bob s transaktion väntar sedan Alice låste raderna med Version = 'v1'

    • Alice begår sin transaktion

    • Bob s transaktion misslyckas med Cannot serialize access

För att kringgå detta, ställ in TRANSACTION ISOLATION LEVEL till READ COMMITTED :

transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

I det här fallet, Bob s fråga kommer att skickas på nytt efter Alice begår sina ändringar, som om Bob s transaktion startades efter Alice sin ena begicks.

Uppdatera

Kan du skicka ett spår av din anslutning?

För att göra detta, utfärda detta kommando direkt efter anslutning:

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

, titta sedan i $ORACLE_HOME\admin\udump för en ny *.trc fil




  1. Få antalet dagar i en månad i PostgreSQL

  2. MySQL-servern har försvunnit - på exakt 60 sekunder

  3. GROUP BY-beteende när inga aggregerade funktioner finns i SELECT-satsen

  4. Ingen form av databascache för att minska dubbletter av databasfrågor.