4. ロックの影響を忘れるべからず
4.2. デッドロックについて ( アプリケーション開発時の留意点 )
Symfoware Server べからず集
Symfoware Server べからず集
アクセスする行を局所化する
Symfoware は、アプリケーションに返した行だけでなく、アクセスした行全てに排
他を獲得します。適切なインデックスを定義してアクセスする行を局所化することで、
トランザクションの多重実行性能が向上すると同時にデッドロックの発生頻度を減ら すことができます。
適切なインデックスが使用されているかどうかの確認とチューニング方法はマニュア
ル“SQLTOOL ユーザーズガイド”を参照してください。
一度読み込んだ行を更新する時は、読込み時から非共用モードで目的の行を占有しま す。以下の何れかの方法で可能です。
カーソルで更新する場合は、カーソルの更新可能句にFOR UPDATE を指定し ます。
UPATE 文探索、DELETE 文探索は、内部的に参照する行を共用モードで参照
し、更新する時に非共用モードで再度占有しているため、動作環境パラメタの
USQL_LOCK に“EX”を指定することで、検索時から非共用モードで行を占
有します。
単一行SELECT 文で検索した行を更新する場合は、単一行SELECT 文の占有
モードに“EXCLUSIVELOCK”を指定します。
イルシデーションロックをサポートしていないバージョンの Symfoware では
単一行SELECT 文をFOR UPDATEを指定したカーソルに変更します。
検索処理の排他をSQL文毎に開放する
一度参照したデータを他のトランザクションで更新されても良い場合は、イルシデー ションロックを使用して、占有モードに“FREE LOCK”を指定し、SQL 文の実行 後に排他を開放することで、デッドロックの発生が減ることがあります。
イルシデーションロックをサポートしていないバージョンのSymfoware ではトラン ザクションの独立性水準にREAD COMMITTED を指定するか、単一行の場合には、
READ ONLYを指定します。
COMMIT の回数を増やす
COMMIT の回数を増やすことによって、占有資源を少なくしてデッドロックを減ら
します。トランザクションの整合性を保てる範囲でCOMMIT の実行回数を増やすこ とを検討します。
更新トランザクションでも参照排他を外す。(同じ行の更新が同時に発生しない場合に
Symfoware Server べからず集 の整合性が保証できるなら、更新を行う業務の検索部分にも排他なしを検討します。
排他なしにするには、トランザクションの独立性水準とアクセスモードに READ
UNCOMMITTED、READ WRITE を指定する方法と、イルシデーションロックを
使用して、UPDATE 文やDELETE 文、SELECT 文の占有モードに“NO LOCK” を指定する方法があります。
なお、UPDATE 文やDELETE 文にNO LOCKを指定しても更新した行には排他を
獲得するので、トランザクションが終了するまで、他のトランザクションから更新さ れることはありません。
4.2.2. 未対処時の影響 (1) 現象分類
アプリケーションの異常 (2) 現象/原因
デッドロックが発生し、SQLSTATE に“トランザクションの直列化に失敗”を表す 例外コードが設定されます。
4.2.3. 備考
Symfoware Server アプリケーション開発ガイド(共通編)
1.1.9 行単位の排他を使用する場合の注意事項
1.1.10 デッドロックの対処方法
Symfoware Server べからず集