Symfoware Server アプリケーション開発ガイド(埋込みSQL編) - FUJITSU - |
目次 索引 |
第2章 アプリケーションの設計 | > 2.4 トランザクションと排他制御 |
行単位の排他を使用する場合に、設計時点で注意しなければならない事項について説明します。
行単位の排他を使用する場合は、そのトランザクションがアクセスしていない行は占有しません。競合する別のトランザクションでは、最初のトランザクションがアクセスしていない行を更新したり、新たな行を追加したりすることができます。このため、以下のような現象が起こることがあります。構築する業務において、この現象が発生すると不都合な場合は、行単位の排他を使用しないでください。
同一トランザクション内で、同一のSQL文を繰り返し実行した場合に、異なる集合が検索されることがあります。例えば、
カーソルで検索する行が増えることがあります。
一度目は成功した単一行SELECT文が、例外(基数違反)となることがあります。
集合関数の結果が変化することがあります。
探索条件に副問合せを指定した問合せの検索結果が変化することがあります。
行単位の排他では、INSERT文は他のトランザクションの終了を待たずに実行できます。このため、あるトランザクションで行を削除して、新たな行を挿入する操作を行っているとき、競合する別のトランザクションでは、まれに削除された行も挿入された行も参照できない場合があります。また、以下の条件を満たすUPDATE文の実行においても、Symfoware/RDBが内部的に行の削除と挿入を行うため、更新前の行も更新後の行も参照できない場合があります。
クラスタキー列を更新するUPDATE文を実行している。
DSI分割している場合の分割キーを更新するUPDATE文を実行している。
例
利用者AがT1の全レコードを検索します。これと同時に、利用者Bが、C1が40であるレコードを削除して、C1が25であるレコードを挿入します。
トランザクション中で参照された資源の排他情報は、COMMIT文またはROLLBACK文で回収されます。排他情報の数は、行排他の場合は行数、ページ排他の場合はページ数になります。COMMIT文またはROLLBACK文を実行すると以下の事象が発生します。
管理している資源数に比例して、COMMIT文またはROLLBACK文の処理時間が長くなります。また、COMMIT文やROLLBACK文実行中に、そのRDBシステム内で最初にアクセスする資源に対してSQL文やRDBコマンドを実行すると、COMMIT文やROLLBACK文が終了するまで待たされます。トランザクションを短くするか、あらかじめrdbconbfコマンドでバッファ結合を行った上で運用してください。
行単位の排他では、トランザクション中に行った更新内容はCOMMIT文実行時にまとめてインデックスへ反映します。このため、トランザクション中に行った挿入、インデックスキー値更新および削除の件数に比例してCOMMIT文の処理時間も長くなります。
COMMIT文実行時に、以下のエラーが発生する可能性があります。WHENEVER文を利用して、COMMIT文もエラー処理の対象としてください。
テンポラリログ領域不足
インデックスのDSIの容量不足
デッドロック
行単位の排他を使用する場合、DELETE文またはUPDATE文を実行することによってDSI内に発生する削除領域は、トランザクション完了後に再利用されます。そのため、同一トランザクション内で大量の件数を削除し、続いて挿入を行うような場合は、削除後に一度COMMIT文を実行してトランザクションを区切ることで、領域を有効に使用することができます。
目次 索引 |