トランザクションに独立性があることで、アクティブな各トランザクションは、他のアクティブなトランザクションがシステム内に存在していない場合と同様に動作できます。TimesTenでは、トランザクションの分離レベルとしてANSI SerializableおよびANSI Read_Committedの2つがサポートされています。
リピータブル・リードが保証されます。つまり、同じ問合せを複数回実行するトランザクションで、毎回同じ結果セットが戻されることが保証されます。他のトランザクションで、戻された行に対してUPDATEまたはCREATE VIEWを実行することはできません。また、問合せ条件を満たす新しい行に対してINSERTを実行することもできません。
この分離レベルでは、読取りユーザーが書込みユーザーをブロックできます。また、書込みユーザーは、読取りユーザーおよび他の書込みユーザーをブロックできます。
この分離レベルでは、読取りユーザーは書込みユーザーをブロックしません。また、書込みユーザーも読取りユーザーをブロックしません。これは、読取りおよび書込みを行うデータ項目が同じである場合でも同様です。読取りユーザーおよび書込みユーザーがブロックを実行せずに同じ項目にアクセスできるようにするには、更新する項目のプライベート・コピーを書込みユーザーが作成します。これらのプライベート・コピーは、トランザクションがコミットされるとパブリックになります。また、トランザクションがロールバックされると破棄されます。したがって、実行中のトランザクションによって更新された項目を別のトランザクションで読み取ると、その項目の更新前の状態が取得されます。コミットされていない状態を取得することはできません。
この分離レベルでは、非リピータブル・リードが可能です。コミット読取りトランザクションで同じ問合せが複数回実行される場合は、更新操作を行うトランザクションのコミットの影響で、結果が異なることがあります。
コミット読取り分離レベルを使用した場合、結果セットに複製が存在する可能性があります。いくつかの行が追加または削除され、SELECT文が実行される範囲でコミットされた場合は、SELECT文によって表内の行の合計数より多い行または少ない行が選択されます。これは、UPDATE、INSERTまたはDELETEによって索引に対して値の追加または削除が実行され、SELECTスキャンでその索引が使用された場合に発生する可能性があります。また、INSERTまたはDELETEによって表に対して行の追加または削除が実行され、SELECT操作で全表スキャンが使用された場合も発生する可能性があります。
これは、順序付けられている索引値に対してUPDATEを実行することによって古い値が削除され、新しい値が別の場所に挿入されるため発生します。つまり、UPDATEによって、索引内のある位置から別の位置に行が移動されます。索引スキャンでは、両方の位置に同じ行が検出されると、同じ行が2回戻されます。これは、シリアル・スキャンでは発生しません。表ページが順序付けられておらず、UPDATEに対して行を移動する必要がないためです。したがって、スキャンによって行が渡されると、同じ行は再度参照されません。
この問題を回避するには、SELECTでシリアライズ可能分離レベルを使用します。これによって、INSERT、DELETEまたはUPDATEの同時操作を防止できます。INSERTまたはDELETEはすべての索引に影響を及ぼすため、これらの操作で索引を使用してこの問題を回避する信頼性の高い方法はありません。UPDATEの場合は、更新されていない索引をSELECT文で使用してこの問題を回避することができます。
TimesTenのすべてのデータ・アクセスでは、ロックまたはコピーを使用して独立性が確保されます。アプリケーションでトランザクションの分離レベルを設定するには、SQL_TXN_ISOLATIONフラグとともにSQLSetConnectOption ODBC関数を使用するか、またはIsolation接続属性を設定します。
マテリアライズド・ビューを常に一貫性がある状態に保つために、すべてのビュー・メンテナンス処理はシリアライズ可能分離レベルで効果的に実行されます。これは、トランザクションがコミット読取り分離レベルの場合も同様です。これは、トランザクションで、ビュー・メンテナンス時に読み取られるすべてのデータ項目に読取りロックを設定することを意味します。ただし、これらのロックは、トランザクションが終了するまで保持されるのではなく、ビュー・メンテナンス処理をトリガーしたINSERT文、UPDATE文またはCREATE VIEW文が終了すると解除されます。
TimesTenでは、行レベル・ロックおよびデータ・ストア・レベル・ロックがサポートされています。
Row
に設定されたttLockLevel組込みプロシージャをコールする必要があります。DS
に設定されたttLockLevel組込みプロシージャをコールします。接続ごとに異なるロック・レベルを使用できます。ただし、データ・ストア・レベル・ロックを使用している接続が1つでも存在すると、並行性が低下します。パフォーマンスについては、『Oracle TimesTen In-Memory Database Java開発者およびリファレンス・ガイド』の最適なロック方法の選択に関する説明を参照してください。TimesTen Cアプリケーションのチューニングについては、『Oracle TimesTen In-Memory Database C開発者およびリファレンス・ガイド』の最適なロック方法の選択に関する説明を参照してください。