表示されている例外は、厳密なシリアル化を使用した直接的な結果です。複数のトランザクションが同時にアクティブになっている場合、それぞれがSET TRANSACTION ISOLATION LEVEL SERIALIZABLEで開始され、そのうちの1つがコミットすると、他のトランザクションはORA-08177を取得します。これが厳密なシリアル化の実施方法です。別のトランザクションがシリアル化可能なセッションに必要なテーブルにコミットすると、データベースはISOLATIONLEVELSERIALIZABLEで開始されたセッションでORA-08177をスローします。したがって、基本的に、厳密なシリアル化が本当に必要な場合は、次のように、ORA-08177をインテリジェントに処理する必要があります。
DECLARE
bSerializable_trans_complete BOOLEAN := FALSE;
excpSerializable EXCEPTION;
PRAGMA EXCEPTION_INIT(excpSerializable, -08177);
BEGIN
<<SERIALIZABLE_LOOP>>
WHILE NOT bSerializable_trans_complete
LOOP
BEGIN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
MERGE ...; -- or whatever
COMMIT;
bSerializable_trans_complete := TRUE; -- allow SERIALIZABLE_LOOP to exit
EXCEPTION
WHEN excpSerializable THEN
ROLLBACK;
CONTINUE SERIALIZABLE_LOOP;
END;
END LOOP; -- SERIALIZABLE_LOOP
END;
シリアル化は魔法ではなく、「無料」でもありません(「無料」とは、「開発者としての私は、正しく機能させるために何もする必要がない」ことを意味します)。それを適切に機能させるには、開発者の側でより多くの計画と作業が必要です。共有してお楽しみください。