ヘッダーをスキップ
Oracle TimesTen In-Memory Database概要
リリース7.0
E05163-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

ロック

ロックは、リソースへのアクセスをシリアライズして、あるユーザーによって参照中または変更中の要素が別のユーザーによって同時に変更されるのを防ぐために使用されます。TimesTenでは、データベースに共有モードでアクセスすると、ロックが自動的に実行されます。

シリアライズ可能トランザクションは、これらのトランザクションで読み取るアイテムに対して共有ロックを、これらのトランザクションで書き込むアイテムに対して排他ロックを取得します。これらのロックは、トランザクションがコミットまたはロールバックされるまで保持されます。コミット読取りトランザクションは、これらのトランザクションで書込みアイテムに対して排他ロックを取得し、トランザクションがコミットされるまでこれらのロックを保持します。コミット読取りトランザクションは、これらのトランザクションで読み取るアイテムに対してロックを取得しません。トランザクションをコミットまたはロールバックすると、すべてのカーソルが閉じられ、トランザクションによって保持されていたすべてのロックが解除されます。

TimesTenはデッドロック検出を行って、デッドロックの状況をレポートし、削除します。デッドロックのエラーが原因でロックを拒否された場合、アプリケーションはトランザクション全体をロールバックして再試行する必要があります。

アプリケーションでは、次の3つのロック・レベルから選択できます。

データベース・レベル・ロック

データベース・レベル・ロックは、トランザクションによるアクセス時にデータベース全体をロックします。すべてのデータベース・レベル・ロックは排他的です。データベース・レベル・ロックを必要とするトランザクションは、データベースにアクティブなトランザクションがなくなるまで開始できません。トランザクションでデータベース・レベル・ロックが取得されると、そのトランザクションがコミットまたはロールバックされるまで、他のすべてのトランザクションはブロックされます。

データベース・レベル・ロックは、表レベル・ロックより同時実行性を制限されるため、同時実行性が不要な場合にバルク・ロードなどの初期化処理でのみ有効です。データベース・レベル・ロックを使用すると、同時実行性およびスループットは低下しますが、行レベル・ロックまたは表レベル・ロックよりレスポンス時間が向上します。

異なるトランザクションは、異なるレベルのロックと共存できますが、データベース・レベル・ロックを使用しているトランザクションが1つでも存在すると、同時実行性が低下します。

データベース・レベル・ロックを実装するには、LockLevel接続属性またはttLockLevel組込みプロシージャを使用します。

表レベル・ロック

表レベル・ロックは、トランザクションによってアクセスされている表をロックします。文が表内のほとんどの行にアクセスする場合に有効です。アプリケーションで、ttOptSetFlag組込みプロシージャをコールして、オプティマイザで表ロックが使用されるようにリクエストできます。オプティマイザによって、表ロックが使用されるタイミングが決定されます。

表ロックは、スループットを低下させる可能性があるため、表の大部分をロックする必要がある場合、または同時実行性が必要ない場合にのみ使用します。たとえば、バルク更新などの処理では、表をロックできます。コミット読取り分離レベルの場合、TimesTenでは、アプリケーションによって明示的にリクエストされていないかぎり、読取り操作に対して表レベル・ロックは使用されません。

行レベル・ロック

行レベル・ロックは、トランザクションによってアクセス中の行のみをロックします。同時実行トランザクションが同一表の行にアクセスできるようにすることで、最高の同時実行性を実現できます。行レベル・ロックは、同時実行トランザクションが多数あり、それぞれが同一表の異なる行で処理中の場合に最適です。

TimesTenでは、デフォルトで行レベル・ロックが有効になります。明示的に設定するには、LockLevel接続属性またはttLockLevel組込みプロシージャを使用します。オプティマイザで特定のトランザクションに使用するために設定するには、ttOptSetFlag組込みプロシージャを使用します。