sql >> Databáze >  >> RDS >> Oracle

ORA-08177:Nelze serializovat přístup pro tuto transakci

Používáte serializovatelnou transakci, která čeká na nějakou jinou transakci a uzamkne stejnou tabulku na ROLLBACK .

Pokud se tato jiná transakce nevrátí zpět, ale místo toho se potvrdí, zobrazí se tato chyba.

Scénář vypadá následovně:

  1. Alice otevře svou relaci prohlížeče, která volá DELETE FROM TABLE1 WHERE Version = 'v1'

    • Bob otevře svou relaci, která volá DELETE FROM TABLE1 WHERE Version = 'v1' po Alice udělala to, ale předtím, než se zavázala.

    Bob transakce uživatele čeká od Alice uzamkl řádky pomocí Version = 'v1'

    • Alice potvrdí svou transakci

    • Bob Transakce uživatele se nezdaří s Cannot serialize access

Chcete-li to obejít, nastavte TRANSACTION ISOLATION LEVEL do READ COMMITTED :

transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)

V tomto případě Bob Dotaz uživatele bude znovu zadán po Alice potvrdí své změny, jako by Bob transakce uživatele byly zahájeny po Alice 's jeden byl spáchán.

Aktualizovat

Mohl byste prosím zveřejnit stopu vašeho připojení?

Chcete-li to provést, zadejte tento příkaz ihned po připojení:

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

, pak se podívejte do $ORACLE_HOME\admin\udump pro nový *.trc soubor




  1. Dílčí dotazy SQL v kontrolním omezení

  2. Vložte, pokud neexistuje Oracle

  3. Oracle Concurrent Manager – CP Analyzer pro E-Business Suite

  4. Konfigurace v rozsahu databáze SQL Server a automatická oprava plánu