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

コミットと選択の間のOracleの遅れ

    デフォルトでは、説明した動作は不可能です。コミットされたトランザクションで行われた変更は、すべてのセッションですぐに利用できるようになります。ただし、例外があります:

    1. COMMITコマンドでWRITEオプションのいずれかを使用していますか?そうでない場合は、COMMIT_WRITE初期化パラメーターの値を確認してください。 「WRITEBATCH」または特に「WRITEBATCHNOWAIT」を使用している場合は、同時実行の問題が発生する可能性があります。 「WRITEBATCHNOWAIT」は通常、書き込みトランザクションの速度が同時実行の問題よりも重要である場合に使用されます。初期化パラメータが「WRITE」バリアントを使用している場合は、コミットでIMMEDIATE句を指定することにより、トランザクションベースでオーバーライドできます(COMMITを参照)

    2. 他のトランザクションがコミットする前に、SET TRANSACTIONを呼び出すデータを読み取ろうとしているトランザクションはありますか? SETTRANSACTIONを使用してSERIALIZATIONLEVELREAD ONLYまたはSERIALIZABLEを指定すると、SET TRANSACTIONの呼び出し後に発生した他のコミットされたセッションから発生した変更がトランザクションに表示されなくなります(SET TRANSACTIONを参照)

    編集:あなたはDataSourceクラスを使用しているようです。私はこのクラスに精通していません-私はそれが接続共有リソースであると思います。現在のアプリの設計では、ワークフロー全体で同じ接続オブジェクトを簡単に使用できない場合があることを認識しています(ステップは独立して動作するように設計されている可能性があり、接続オブジェクトを1つのステップから次へ)。ただし、特に開いているトランザクションに関して、DataSourceオブジェクトに返される接続オブジェクトが「クリーン」であることを確認する必要があります。コードでSETTRANSACTIONを呼び出していない可能性がありますが、他の場所にあるDataSourceの別のコンシューマーが呼び出しており、セッションがSERIALIZABLEまたはREADONLYモードのままで接続をデータソースに戻している可能性があります。接続を共有する場合は、新しいコンシューマーに渡す前に、すべての接続をロールバックする必要があります。

    DataSourceクラスの動作を制御または可視化できない場合は、新しく取得した接続でROLLBACKを実行して、残留トランザクションがすでに確立されていないことを確認することをお勧めします。



    1. SQLServerでフィールド値を文字列に連結します

    2. SQLiteの日付/時刻関数の有効な修飾子

    3. T-SQLを使用してSQLServerデータベースの名前を変更する方法

    4. MariaDBでのTO_BASE64()のしくみ