ロック・レベル

ロックは、リソースへのアクセスをシリアライズして、あるユーザーによって参照中または変更中のリソースが別のユーザーによって同時に変更されるのを防ぐために使用します。

TimesTenでは、すべてのデータベース・アクセスに対してロックが自動的に実行されます。

  • 共有ロックでは、操作の種類に応じて、関連するリソースの共有が可能です(そのため、共有されている行、表またはビューを変更したり削除できません)。複数のトランザクションが同じリソースについて共有ロックを取得できます。

  • 排他ロックでは、データベースでアクティブなトランザクションが常に1つしか存在しないようにします。このロックは、リソースがデータ変更のために共有されて取得されることを防止します。リソースを排他的にロックした最初のトランザクションは、トランザクションが完了してその排他ロックが解除されるまで、そのリソースを変更できる唯一のトランザクションになります。

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

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

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

行レベル・ロック

行レベル・ロックは、トランザクションによってアクセス中の行のみをロックします。同時実行トランザクションで同一表の行にアクセスできるようにすることで、最大限の同時実行性を実現できます。

行レベル・ロックは、同時実行トランザクションが多数あり、それぞれが同一表の異なる行で処理中の場合に最適です。

アプリケーションでは、LockLevel一般接続属性、ttLockLevel組込みプロシージャまたはttOptSetFlag組込みプロシージャを使用して、行レベル・ロックを管理できます。

『Oracle TimesTen In-Memory Databaseリファレンス』ttLockLevelおよびttOptSetFlagを参照してください。

表レベル・ロック

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

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

『Oracle TimesTen In-Memory Databaseリファレンス』ttOptSetFlagを参照してください。

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

データベース・レベル・ロックは、トランザクションによるアクセス時にデータベース全体をロックします。すべてのデータベース・レベル・ロックは排他的です。データベース・レベル・ロックを実装するには、LockLevel一般接続属性またはttLockLevel組込みプロシージャを使用します。

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

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

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

『Oracle TimesTen In-Memory Databaseリファレンス』ttLockLevelを参照してください。