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ě:
-
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'
poAlice
udělala to, ale předtím, než se zavázala.
Bob
transakce uživatele čeká odAlice
uzamkl řádky pomocíVersion = 'v1'
-
Alice
potvrdí svou transakci -
Bob
Transakce 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