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ě:
-
Aliceotevře svou relaci prohlížeče, která voláDELETE FROM TABLE1 WHERE Version = 'v1'Bobotevře svou relaci, která voláDELETE FROM TABLE1 WHERE Version = 'v1'poAliceudělala to, ale předtím, než se zavázala.
Bobtransakce uživatele čeká odAliceuzamkl řádky pomocíVersion = 'v1'-
Alicepotvrdí svou transakci -
BobTransakce uživatele se nezdaří sCannot 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