SELECT文の結果が重複する
コミット読取り分離レベルを使用すると、結果セットで重複する可能性があります。SELECTによるスキャンの実行範囲内でいくつかの行が追加または削除されてコミットされた場合に、SELECT文によって選択される行が、表内の行の合計数より多くなったり、少なくなります。これは、UPDATE、INSERTまたはDELETE文によって索引に対して値の追加または削除が実行され、SELECTによるスキャンでその索引が使用されている場合に発生する可能性があります。また、INSERTまたはDELETEによって表に対して行の追加または削除が実行され、SELECT操作で全表スキャンが使用されている場合も発生する可能性があります。
索引値は順序付けられています。索引値に対してUPDATEすると、古い値が削除され、新しい値が別の場所に挿入される場合があります。つまり、ある場所から別の場所に索引内の行が移動されます。索引スキャンでは、両方の位置に同じ行が検出されると、同じ行が2回返されます。シリアル・スキャンを行う場合、表ページが順序付けられておらず、UPDATEに対して行を移動する必要がないため、このような動作は発生しません。したがって、スキャンによって渡された行が再度参照されることはありません。
この問題を回避するには、SELECT文でシリアライズ可能分離レベルを使用します。これによって、INSERT、DELETEまたはUPDATEの同時操作を防止できます。INSERTまたはDELETEはすべての索引に影響を及ぼすため、これらの操作で索引を使用してこの問題を回避する信頼性の高い方法はありません。UPDATEの場合は、更新されていない索引をSELECT文で使用してこの問題を回避することができます。
シリアライズ可能分離の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の「分離およびロックによる並行性制御」を参照してください。