データベース トランザクション内でデータベース テーブルからの読み取りを実行することのポイントは何だろうと思っていました。私の場合、それは 1 つのテーブルに対する 1 つの単一の select ステートメントです。このテーブルは、他のスレッドによって更新される可能性があります。この状況で、データベース トランザクションはどのように役立ちますか? この特定のケースに関する情報を見つけるのに苦労しています。
1 に答える
トランザクションは、クエリと同時更新の間の分離レベルを定義するのに役立ちます。同時更新が結果として得られるデータにどのように影響するかを定義します。結果のデータの一貫性を確保することが重要な場合があります。このサイト には、一般的な分離モードがリストされています。
none : トランザクション分離なし。
read-committed : ダーティ リードが防止されます。反復不可能な読み取りとファントム読み取りが発生する可能性があります。
read-uncommitted : ダーティ リード、繰り返し不可能なリード、ファントム リードが発生する可能性があります。
repeatable-read : ダーティ リードと非反復可能リードが防止されます。ファントム読み取りが発生する可能性があります。
serializable : ダーティ リード、繰り返し不可能なリード、ファントム リードが防止されます。
EDIT : 反復不可能な読み取りとは、クエリから取得するデータが新しくコミットされたデータを考慮に入れることを意味するため、クエリが複数回実行された場合、結果が異なる可能性があります。ダーティ リードも同様ですが、他のトランザクションからコミットされていないデータを読み取ることもできます。
常に一貫したデータが必要な場合にのみ、分離を考慮する必要があります。一貫性を気にしないというのは奇妙に聞こえるかもしれませんが、実際のアプリケーションではパフォーマンスと引き換えになることがよくあります。
たとえば、多くの Web ショップで見られる「在庫あり」の表示は、多くの場合、完全に分離せずに取得されます。2 人の顧客が在庫の最後の商品を購入しようとすると、1 人が最後の商品を受け取り、もう 1 人はその商品がショップによって再注文されるまで待たなければなりません。
使用される分離を決定および定義する方法は、使用している言語、データベース、およびフレームワークによって異なります。たとえば、Hibernate では、以下の分離プロパティを設定できますConnection
。
connection.setTransactionIsolation(Connection.READ_UNCOMMITTED);