Ultra Light は、デフォルトでは独立性レベル 0 で動作するため、次のような副次的影響が発生する可能性があります。
SELECT 文を実行するときは、ロック・オペレーションは必要ありません。
アプリケーションは、コミットされていないデータにアクセスできます (ダーティ・リード)。このシナリオでは、コミットされていないデータベースのローにアプリケーションがアクセスできるため、別のトランザクションによりロールバックされる可能性が発生します。これにより幻ローが発生します。幻ローとは元のクエリの後に追加されたローのことで、これにより、繰り返されて重複したクエリで返された結果セットの内容に相違が生じます。
ダーティ・リードの影響を示すチュートリアルについては、チュートリアル:ダーティ・リードを参照してください。幻ローを示すチュートリアルについては、チュートリアル:幻ローを参照してください。
アプリケーションは、繰り返し不可能読み出しを実行できます。このシナリオでは、アプリケーションがデータベースからローを読み出し、他の操作の実行に移ります。そこへ、別のアプリケーションがローの更新や削除を行い、変更をコミットします。最初のアプリケーションが元のローを再度読み出すと、更新された情報が取得されるか、元のローが削除されたことを発見します。
繰り返し不可能読み出しの影響を示すチュートリアルについては、チュートリアル:繰り返し不可能読み出しを参照してください。
たとえば、A と B という 2 つの接続があり、それぞれにトランザクションがあるとします。
接続 A がクエリの結果セットを処理する場合、Ultra Light によって、現在のローのコピーがフェッチされてバッファに格納されます。
ローを読み込んだりフェッチしたりしても、ローはロックされません。接続 A がローをフェッチしても変更はしない場合、接続 B はこのローを変更できます。
接続 A は現在のローを変更するときに、バッファ内のコピーを変更します。接続 A が Update メソッドを呼び出すか結果セットを閉じると、バッファ内のコピーはデータベースに書き戻されます。
このローに対して書き込みロックが掛けられ、他のトランザクションがこのローを変更できなくなります。この変更は、接続 A がコミットを実行するまで、コミットされないままになります。
変更によっては、接続 B が現在のローをフェッチすると、次の現象が発生する可能性があります。
接続 A による変更 | 結果1 |
---|---|
ローの削除 | 接続 B は結果セットの次のローを取得します。 |
ローの変更 | 接続 B はローの最新のコピーを取得します。 |
1 接続 A および B で使用されたクエリには、テンポラリ・テーブルは含まれていません。テンポラリ・テーブルは、他の副次的な影響を与える可能性があります。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |