ロックとは、リソースへのアクセスのシリアル化に使用する高水準の構造で、あるユーザーによって参照中または変更中の要素が、別のユーザーによって同時に変更されるのを防ぎます。データ・ストアが共有モードでアクセスされる場合、TimesTenは自動的にロックを設定します。
アプリケーションでは、次の3つのロック・レベルから選択できます。
TimesTenでは、LockLevel構成属性とttLockLevel()プロシージャを提供して、データ・ストア全体をロックするか、あるいはオプティマイザの選択によって行またはデータ・ストア全体のいずれかをロックします。アプリケーションでは、オプションで、ttOptSetFlag()プロシージャをコールして、問合せオプティマイザが表をロックするように提案することもできます。行レベルおよび表レベルのロックでは、ロギングが有効である必要があります。ロギングが無効な場合は、データ・ストア・レベルのロックのみ使用可能です。
シリアライズ可能トランザクションは、これらのトランザクションで読み取るアイテムに対して共有ロックを、これらのトランザクションで書き込むアイテムに対して排他ロックを取得します。これらのロックは、トランザクションがコミットまたはロールバックされるまで保持されます。コミット読取りトランザクションは、これらのトランザクションで書込みアイテムに対して排他ロックを取得し、トランザクションがコミットされるまでこれらのロックを保持します。コミット読取りトランザクションは、これらのトランザクションで読み取るアイテムに対してロックを取得しません。トランザクションをコミットまたはロールバックすると、すべてのカーソルが閉じられ、トランザクションによって保持されていたすべてのロックが解除されます(シリアライズ可能分離レベルおよびコミット読取り分離レベルの詳細は、「トランザクションの独立性」を参照)。
TimesTenはデッドロック検出を行って、デッドロックの状況をレポートし、除去します。デッドロックのエラーが原因でロックを拒否された場合、アプリケーションはトランザクション全体をロールバックして、トランザクションを再試行する必要があります。
アプリケーションでは、ttLockWait()プロシージャを使用して、別の接続が使用中のロックの待機時間(秒)を制御できます。
図5.1 ロック・レベル
データ・ストア・レベル・ロックは、トランザクションによるアクセス時にデータ・ストア全体をロックし、他のトランザクションによるアクセスを禁止します。すべてのデータ・ストア・レベル・ロックは排他的です。データ・ストア・レベル・ロックを必要とするトランザクションは、データ・ストアにアクティブなトランザクションがなくなるまで開始できません。いったんトランザクションでデータ・ストア・レベル・ロックが取得されると、トランザクションがコミットするまで、他のすべてのトランザクションはブロックされます。
データ・ストア・レベル・ロックでは、表レベル・ロックより同時実行性を制限されるため、通常、データ・ストア・レベル・ロックは、同時実行性が不要な場合にバルク・ロードなどの初期化処理で有効です。データ・ストア・レベル・ロックを使用すると、同時実行性およびスループットは低下しますが、行レベル・ロックまたは表レベル・ロックよりレスポンス時間が向上します。
異なるトランザクションは、異なるレベルのロックと共存できますが、データ・ストア・レベル・ロックを使用しているトランザクションが1つでも存在すると、同時実行性が低下します。
表レベル・ロックは、トランザクションによってアクセスされる際に表をロックし、文が表の大部分の行にアクセスする場合に有効です。こうした文には、単一のトランザクションで実行される、問合せ、更新、削除、または複数の挿入があります。すべてのSQL文に対して、オプティマイザが、表ロックを使用するタイミングを判断します。また、結合時に表の大部分の行にアクセスする文を複数含むトランザクションを最適化するために、アプリケーションではttOptSetFlag()プロシージャをコールして、オプティマイザで表ロックを使用するようにリクエストできます。
すべてのより粒度の高いロックと同様に、表ロックはスループットを低下させる可能性があるため、表の大部分をロックする必要がある場合、または同時実行性が必要ない場合にのみ使用します。コミット読取り分離レベルの場合、TimesTenでは、ttOptSetFlag()をコールして、アプリケーションによって明示的にリクエストされていないかぎり、読取り操作に対して表レベル・ロックを使用しません。
行レベル・ロックは、トランザクションによってアクセス中の行のみをロックします。同時実行トランザクションが同一表の行にアクセスできるようにすることで、最高の同時実行性を実現できます。通常、行レベル・ロックは、同時実行トランザクションが多数あり、それぞれが同一表の異なる行で処理中の場合に最適です。