スクリプト[1]で定義されたテーブルを持って、SSMSの2つのウィンドウでスクリプトを実行します
--1) first in first SSMS window
set transaction isolation level READ UNCOMMITTED;
begin transaction;
update aaa set Name ='bbb'
where id=1;
-- results in "(1 row(s) affected)"
--rollback
および1)後
--2)after launching 1)
select * from aaa --deleted comments
where id<>1
--is blocked
1)ウィンドウのトランザクション分離レベルとは関係なく、2)のSELECTはブロックされます。
なんで?
UPDATEの分離レベルは、他のトランザクションのステートメントに影響を与えますか?
最高の分離レベルは、2)のデフォルトのREADCOMMITTEDです。
範囲ロックは原因ではありません。SELECTはCOMMITTEDREADS(NONREPEATABLE READS)およびPHANTOM READS(Repeatable Reads)の問題に悩まされているはずです[2]
どうすればそれを苦しめることができますか?
SELECTをブロックせずにUPDATEを行うにはどうすればよいですか?
[1]
CREATE TABLE aaa
(
Id int IDENTITY(1,1) NOT NULL,
Name varchar(13) NOT NULL
)
insert into aaa(Name)
select '111' union all
select '222' union all
select '333' union all
select '444' union all
select '555' union all
select '666' union all
select '777' union all
select '888'
[2] http://en.wikipedia.org/wiki/Isolation_(database_systems
)
をクリックすると、コピーして貼り付けるか、末尾を追加します)
更新:
SELECT WITH(NOLOCK)はブロックされていません...
Update2:
または、同じことで、コミットされていない読み取り
UPDATEはSELECT行とは異なることに注意してください。
同じ場合でも、この動作は分離レベルの説明と矛盾します[2]
ポイントは次のとおりです。
- 同じ(UPDATE-d)テーブルから他に誰がSELECTを実行するのかわからないが、行の更新とは無関係であると仮定します。
- 分離レベルを理解する[2]
SQL Server 2008 R2 Dev