複数の接続で同時にデータ・ストアにアクセスする場合、TimesTenは、ロックを使用して様々なトランザクションが明示的に分離されて処理されるようにします。TimesTenでは、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』のトランザクションの管理およびリカバリに関する項で説明されている分離レベルがサポートされています。また、データ・ストア・レベル、表レベルおよび行レベルのロック・レベルがサポートされています。LockLevel接続属性を使用すると、データ・ストア・レベルと行レベルのロックのいずれを使用するかを指定できます。表ロックを使用するかどうかを示すオプティマイザ・ヒントを設定するには、ttOptSetFlagプロシージャを使用します。デフォルトのロック粒度は行ロックです。
データ・ストアでの競合が非常に少ない場合は、表レベル・ロックを使用します。これによって、パフォーマンスが改善され、デッドロックの可能性も低くなります。通常、トランザクションが短い場合または接続が少ない場合(あるいはその両方の場合)は、データ・ストアでの競合が少なくなります。この場合、トランザクションが重複する可能性は低くなります。
また、表レベル・ロックは、文が表のほぼすべての行にアクセスする場合にも有効です。このような文には、1つのトランザクションで実行される問合せ、更新、削除、複数の挿入などがあります。
データ・ストア・レベル・ロックでは表レベル・ロックより同時実行性が制限されるため、通常、データ・ストア・レベル・ロックは、同時実行性が必要でない場合にバルク・ロードなどの初期化処理でのみ有効です。データ・ストア・レベル・ロックを使用すると、スループットは低下しますが、行レベル・ロックまたは表レベル・ロックよりレスポンス時間が向上します。
通常、同じ行にアクセスする必要がほとんどない同時トランザクションが多数存在する場合は、行レベル・ロックを使用することを薦めします。
行レベル・ロックを使用している場合、アプリケーションでODBC関数SQLSetConnectOptionを使用して、トランザクションを分離レベルSERIALIZABLEで実行するか、READ_COMMITTEDで実行するかを選択できます。デフォルトの分離レベルはREAD_COMMITTEDです。Isolation接続属性を使用すると、これらの分離レベルのいずれかを新しい接続に指定できます。
SERIALIZABLEトランザクション分離レベルで実行すると、トランザクションの処理中、TimesTenですべてのロックが保持されるため、次の処理が実行されます。
READ_COMMITTEDトランザクション分離レベルで実行すると、トランザクションの処理中、TimesTenで更新のロックのみが保持されるため、次の処理が実行されます。
タイムアウトおよびデッドロックのエラー(エラー番号6001、6002および6003)をチェックすると、システムに競合が過度に存在しているかどうかを確認できます。この情報は、SYS.MONITOR表のLOCK_TIMEOUTSおよびDEADLOCKS列でも確認できます。