同じテーブルをROLLBACKにロックする他のトランザクションを待機するシリアル化可能なトランザクションを使用しています 。
この他のトランザクションがロールバックせず、代わりにコミットした場合、このエラーが発生します。
シナリオは次のようです:
-
AliceDELETE FROM TABLE1 WHERE Version = 'v1'を呼び出すブラウザセッションを開きますBobDELETE 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の場合 ファイル