排他確保によるデッドロックを発生させないためには,各UAPで確保する資源に対する排他の種類・順序を整理する必要があります。ここでは,TAMレコードの追加・削除に伴う排他確保によるデッドロックの発生と注意について説明します。
「追加削除できる更新型」のTAMテーブルで,同一トランザクション内で同一テーブルに対して「追加(削除),およびその他TAMアクセス」を行う場合は,このトランザクションがデッドロックの要因になる可能性があります。これは次の要因を満たす場合です。
テーブル排他ありTAMテーブルアクセス機能でレコードを更新,追加,または削除していたTAMテーブルを,テーブル排他なしTAMテーブルアクセス機能を使用するように変更する場合,デッドロックとなることがあります。
テーブル排他ありTAMテーブルアクセス機能でレコードを更新,追加,または削除する場合,更新排他でテーブル排他を確保します。このため,追加または削除するレコードの順序が同じレコードにアクセスするほかのトランザクションと異なっていても,テーブル排他で待ち合わせているのでデッドロックにはなりません。しかし,テーブル排他なしTAMテーブルアクセス機能を使用するTAMテーブルではデッドロックとなることがあります。このため,テーブル排他ありTAMテーブルアクセス機能でレコードを更新,追加,または削除していたTAMテーブルを,テーブル排他なしTAMテーブルアクセス機能を使用するように変更する場合,UAPでアクセスするレコードの順序を統一してください。
テーブル排他ありTAMテーブルアクセス機能からテーブル排他なしTAMテーブルアクセス機能に変更してデッドロックとなる例を次の図に示します。
図4-16 テーブル排他ありTAMテーブルアクセス機能からテーブル排他なしTAMテーブルアクセス機能に変更してデッドロックとなる例
UAP1では,レコード1,レコード3の順に削除し,UAP2では,レコード3,レコード1の順に更新するとします。テーブル排他ありTAMテーブルアクセス機能もテーブル排他なしTAMテーブルアクセス機能も図の(1)~(4)の順に実行されるとします。
テーブル排他ありTAMテーブルアクセス機能では,次の手順で動作します。
UAP1のトランザクションが決着したあと,UAP2の手順2では参照目的のテーブル排他と更新目的のレコード排他を確保し,手順4のレコード1の更新では,更新目的のレコード排他を確保します。
テーブル排他なしTAMテーブルアクセス機能では,次の手順で動作します。
デッドロックを回避するには,UAP1の手順1と手順3の順序を入れ替えるか,または,UAP2の手順2と手順4の順序を入れ替えます。
同一トランザクション内で同一テーブルに対する排他確保の様子を,レコードの「更新+追加」という処理を例に説明します。
更新および追加の目的の排他確保の例を次の図に示します。
図4-17 「更新+追加」の例
図4-18 デッドロック発生
同一トランザクション内では同一テーブルに対して「追加(削除)およびその他TAMアクセス」を行う必要があり,上記のようなデッドロックの危険がある場合は,該当するトランザクションでテーブルに対して更新排他(EX)を確保してから処理をするようにしてください。
テーブルに対して更新排他を確保するためには,「追加(削除)」を先に行うか,またはC言語であればテーブルに対してトランザクション内でテーブル排他でオープンするようにしてください。