- ダーティ読み取りが可能な場合は常に、LOCKING ... FOR ACCESSを使用する。ただし、CREATE INDEXは例外。
- BTEQでトランザクション処理を扱うことを検討する。BTEQは、トランザクションのロールバック後に、トランザクションの処理をトランザクションの始めからではなく、障害が発生した場所から続行します。
- フォールバック テーブルに対してDSSの更新とPIの更新の両方が行なわれる場合は、DBS制御ユーティリティを使用してDeadLockTimeoutフィールドを30秒に設定します。
- Archive/Recoveryのジョブに対して、必ずRELEASE LOCKSを使用する。
- トランザクションの前に、LOCKING ROW[FOR]WRITE/EXCLUSIVE文節を使用する。この文節を使用すると、ターゲット テーブルに対してすでに使用されているロックがオーバーライドされることはなくなります。LOCKING ROWを使用するのが適切なのは、PIまたはSIの制約に基づいている単一テーブル選択についてのみです。例えば、次のようになります。
LOCKING ROW FOR WRITE SELECT y FROM tableA WHERE pi =1; UPDATE tableA SET y=0 WHERE pi =1;
- マクロでは、テーブル レベルのデッドロックを最小限に抑えるために、トランザクションの開始(BT)/トランザクションの終了(ET)ではなく、複文リクエストを使用する。例えば、次のようになります。
LOCKING ROW FOR WRITE SELECT y FROM tableA WHERE pi =1 ; UPDATE tableA SET y=0 WHERE pi =1 ;
上記のようにすると、すべての必要なロックが開始時点で適用されるようになり、デッドロックが発生する可能性がなくなります。処理順序を調べるには、EXPLAIN修飾子を使用します。
- 基本テーブルの複数の行が結合インデックス サブテーブルの1行を共有しているテーブルを更新する場合は(集約結合インデックスのほとんどの場合)、同じ行に深刻な衝突が生じることがあるため注意してください。