Symfoware(R) Server RDBユーザーズガイド 応用プログラム開発編 - FUJITSU - |
目次 索引 |
行単位の排他を使用する場合に、設計時点で注意しなければならない事項について説明します。
行単位の排他を使用する場合は、そのトランザクションがアクセスしていない行は占有しません。競合する別のトランザクションでは、最初のトランザクションがアクセスしていない行を更新したり、新たな行を追加したりすることができます。このため、以下のような現象が起こることがあります。構築する業務において、この現象が発生すると不都合な場合は、行単位の排他を使用しないでください。
同一トランザクション内で、同一のSQL文を繰り返し実行した場合に、異なる集合が検索されることがあります。例えば、
カーソルで検索する行が増えることがあります。
一度目は成功した単一行SELECT文が、例外(基数違反)となることがあります。
集合関数の結果が変化することがあります。
探索条件に副問合せを指定した問合せの検索結果が変化することがあります。
行単位の排他では、INSERT文は他のトランザクションの終了を待たずに実行できます。このため、あるトランザクションで行を削除して、あらたな行を挿入する操作を行っているとき、競合する別のトランザクションでは、まれに削除された行も挿入された行も参照できない場合があります。また、以下の条件を満たすUPDATE文の実行においても、Symfowareが内部的に行の削除と挿入を行うため、更新前の行も更新後の行も参照できない場合があります。
クラスタキー列を更新するUPDATE文を実行している。
DSI分割している場合の分割キーを更新するUPDATE文を実行している。
COMMIT文実行時に、以下のエラーが発生する可能性があります。WHENEVER文を利用して、COMMIT文もエラー処理の対象としてください。
テンポラリログ領域不足
デッドロック
行単位の排他を使用する場合、DELETE文またはUPDATE文を実行することによってDSI内に発生する削除領域は、同一トランザクション内では、再利用されません。そのため、バッチ業務のように大量の更新系のSQL文を発行する場合には、DSI単位またはページ単位の排他を使用するか、またはトランザクションをCOMMIT文により細かく区切って実行してください。
目次 索引 |