ロック・レベルと分離レベルを検証する
複数のアプリケーションがどのようにデータベースに同時アクセスするかで、パフォーマンスが大きく影響を受けることがあります。
アプリケーションは、データベース全体、個々の表および個々の行に対してロックを取得できます。それとは別に、トランザクションがコミットまたはロールバックするまで読取りロックや更新ロックを保持するかどうかを決定する分離レベルも設定できます。
SYS.SYSTEMSTATS表、SYS.MONITOR表を確認するか、またはttXactAdminユーティリティを使用して、アプリケーションがロックの待機に時間を費やしているかどうかを検出できます。詳細は、「デッドロックとタイムアウトを確認する」および「ttXactAdminユーティリティの使用」を参照してください。
ロックの競合が激しい場合は、次のように実装することによって、システム全体のパフォーマンスを改善できる場合があります。
-
LockLevel構成属性を設定するか、ttLockLevelプロシージャを使用して、データベース全体ではなく、行をロックします。行ロックはデフォルトです。 -
ttOptSetFlagプロシージャを使用して、問合せオプティマイザが表にロックをかけないようにします。特に多くの表に影響を与える更新の場合などで、表ロックはデフォルトになっている場合があります。 -
トランザクション・データへのシリアライズ可能アクセスを必要としないアプリケーションに対しては、コミット読取り分離レベル(デフォルトは、
Isolation=1)を使用します。
ロックの競合を最小になるように前述のとおり設定しても、多数の競合が発生する場合は、競合がアプリケーション自体に関係している可能性もあります。たとえば、同時実行のスレッドが、繰り返し同じ行にアクセスしているような場合です。このような競合の検出には、ttXactAdminユーティリティが役立つことがあります。また、このような状況では、トレースが有効なこともあります。
ロックおよび分離レベルの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の「分離およびロックによる並行性制御」を参照してください。