その通りです:標準の 分離レベル
, read committed
、select ステートメントをトランザクションでラップする必要はありません。 Select ステートメントは、トランザクションでラップするかどうかにかかわらず、ダーティ リードから保護されます。
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
select ステートメントは、ロールバックされた更新を読み取りません。トランザクションにラップされていなくてもかまいません。
繰り返し読み取り が必要な場合 の場合、select をデフォルトのトランザクションにラップしても役に立ちません:
connection 1: connection 2:
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction
begin
そしてcommit
ここではステートメントは役に立ちません:2 番目の select
かもしれません 古い名前を読むか、可能性があります 新しい名前を読んでください。
ただし、 serializable
のように、より高い分離レベルで実行する場合 または repeatable read
、グループは繰り返し不可能な読み取りから保護されます:
connection 1: connection 2:
set transaction isolation level
repeatable read
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1 |
commit transaction |
|--> executed here
このシナリオでは、update
最初のトランザクションが完了するまでブロックします。
高い分離レベルは、データベースで同時に作業できる人数を減らすため、めったに使用されません。最上位レベルでは、serializable
、レポート クエリはすべての更新アクティビティを停止します。