デッドロックを回避するためのコーディング・ガイドライン
デッドロック問題を回避するには、アクセスする情報を特定の順序でソートしてからロックを取得することをお勧めします。
デッドロックとは、2 つのプロセスが、互いに他のプロセスによってリソースが解放されるのを待っている、データベースの固有の状態のことです。 例えば、1 番目のクライアント・アプリケーションがテーブルをロックしており、2 番目のクライアント・アプリケーションによってロックされている別のテーブルのロックの取得を試みているとします。このとき、2 番目のアプリケーションが、1 番目のアプリケーションによってロックされているテーブルのロックを取得しようとした場合に、デッドロックが発生する可能性があります。
特定のオーダーに関する情報のソートは、単一トランザクション境界内で複数の在庫アイテムのロックを取得する必要があるような状況に適用できます。 ただし、API を呼び出して、トランザクションのコミットにつき 1 つのアイテムを処理する場合は、ソートする必要はありません。
Db2 データベース内のコミットされていないデータの読み取り
Db2では、表からレコードを選択すると、そのレコードに対する読み取りロックが取得されます。 選択されているレコードが更新されているがコミットされていない場合、スレッドはその変更がコミットされるまで待機します。 あるいは、未コミット読み取り (UR) を使用してレコードを読み取ることもできます。その場合ユーザーには、最後に更新された値が提供されます。
入力 XML で ReadUncommitted 属性を Y に設定することにより、どのリスト API からでもコミットされていないデータを読み取ることができます。 これを行うには、個々の JSP をカスタマイズして、ReadUncommitted 属性を hidden 属性として渡す必要があります。 例:
<input type="hidden" name="xml:/Order/@ReadUnCommitted" value="Y"/>その結果、ロック・シナリオは Db2 データベースで回避されます。 ロックは Db2のデフォルトです。
このフラグを渡すことは、必須ではありません。 しかし、このフラグを Y に設定すると、システムはコミットされていないデータを強制的に読み取ります。 例えば、トランザクション T1 がテーブル TAB-1 を更新したが、トランザクションの
データがコミットされていないとします。 ReadUncommitted フラグが Y に設定されている場合、他のトランザクションは、テーブル TAB-1内のコミットされていないデータを読み取ることができます。
このフラグを設定する前に、同時に実行するトランザクションを評価して、デッドロックが発生する状況が存在するかどうかを判断してください。 そのような状況が発生しないのであれば、このフラグはデフォルト設定のままにしてください。
この動作は Oracleとは異なるため、 Db2 でカスタム・コードを作成する場合は、ロック・エスカレーションを回避するためにこの動作を理解しておく必要があります。