sql >> データベース >  >> RDS >> Oracle

MERGEをシリアライズ可能にする方法

    表示されている例外は、厳密なシリアル化を使用した直接的な結果です。複数のトランザクションが同時にアクティブになっている場合、それぞれが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;
    

    シリアル化は魔法ではなく、「無料」でもありません(「無料」とは、「開発者としての私は、正しく機能させるために何もする必要がない」ことを意味します)。それを適切に機能させるには、開発者の側でより多くの計画と作業が必要です。共有してお楽しみください。



    1. ブートストラップCSSテーブルを使用してMySQLテーブルのデータを表示するにはどうすればよいですか?

    2. Mysqlインデックスを使用したEntityFramework

    3. iPhoneアプリからリモートMySqlデータベースにアクセスする方法

    4. MYSQL MYSQLで2つの日付間のカスタム月差を実行するにはどうすればよいですか?