デッドロックを回避するためのコーディング・ガイドライン

デッドロック問題を回避するには、アクセスする情報を特定の順序でソートしてからロックを取得することをお勧めします。

デッドロックとは、2 つのプロセスが、互いに他のプロセスによってリソースが解放されるのを待っている、データベースの固有の状態のことです。 例えば、あるクライアント・アプリケーションが表のロックを保持し、別のクライアント・アプリケーションによって保持されている 2 番目の表のロックを取得しようとすると、他のアプリケーションが最初のアプリケーションによって保持されているロックを取得しようとすると、デッドロックが発生する可能性があります。

特定のオーダーに関する情報のソートは、単一トランザクション境界内で複数の在庫アイテムのロックを取得する必要があるような状況に適用できます。 ただし、API を呼び出して、トランザクションのコミットにつき 1 つのアイテムを処理する場合は、ソートする必要はありません。

DB2® データベースでのコミットされていないデータの読み取り

Db2では、表からレコードを選択すると、レコードの読み取りロックが取得されます。 選択されたレコードが更新されたがコミットされていない場合、スレッドは変更をコミットするまで待機します。 あるいは、非コミット読み取り (UR) でレコードを読み取ることもできます。その場合、更新された最新の値がユーザーに提供されます。

リスト API の入力 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 内のコミットされていないデータを、他のトランザクションが読み取ることができます。

このフラグを設定する前に、同時に実行するトランザクションを評価して、デッドロックが発生する状況が存在するかどうかを判断してください。 このような状態が発生しない場合、フラグはデフォルト設定のままでなければなりません。