同じテーブルをROLLBACK
にロックする他のトランザクションを待機するシリアル化可能なトランザクションを使用しています 。
この他のトランザクションがロールバックせず、代わりにコミットした場合、このエラーが発生します。
シナリオは次のようです:
-
Alice
DELETE FROM TABLE1 WHERE Version = 'v1'
を呼び出すブラウザセッションを開きますBob
DELETE FROM TABLE1 WHERE Version = 'v1'
を呼び出すセッションを開きますAlice
の後 彼女がコミットする前にそれをしました。
Bob
のトランザクションはAlice
から待機していますVersion = 'v1'
で行をロックしました-
Alice
彼女のトランザクションをコミットします -
Bob
のトランザクションはCannot serialize access
で失敗します
これを回避するには、TRANSACTION ISOLATION LEVEL
を設定します READ COMMITTED
へ :
transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)
この場合、Bob
のクエリはAlice
の後に再発行されます Bob
のように、彼女の変更をコミットします のトランザクションはAlice
の後に開始されました の1つがコミットされました。
更新
接続の痕跡を投稿していただけませんか?
これを行うには、接続直後に次のコマンドを発行します:
(New OracleCommand("ALTER SESSION SET SQL_TRACE=TRUE", connection, transaction)).ExecuteNonQuery();
、次に$ORACLE_HOME\admin\udump
を調べます 新しい*.trc
の場合 ファイル