質問[1]の状況を再現してみました。
SQL Server 2008 R2 SSMS で、wiki の「Isolation (database systems)」[2] からデータを取得して入力したテーブルで、次のコマンドを実行しました。
1) SSMS の最初のタブ (ウィンドウ) の最初
-- transaction isolation level in first window does not influence results (?)
-- initially I thought that second transaction in 2) runs at the level set in first window
begin transaction
INSERT INTO users VALUES ( 3, 'Bob', 27 )
waitfor delay '00:00:22'
rollback
2) 直後、2 番目のウィンドウで
-- this is what I commented/uncommented
-- set transaction isolation level SERIALIZABLE
-- set transaction isolation level READ REPEATABLE
-- set transaction isolation level READ COMMITTED
-- set transaction isolation level READ UNCOMMITTED
SELECT * FROM users --WITH(NOLOCK)
更新:
申し訳ありませんが、結果が修正されました。
私の結果は、2) で設定された分離レベルに応じて、SELECT が返すことです。
すぐに (コミットされていない挿入された行を読み取る)
- NOLOCK を使用した SELECT のすべての場合
- READ UNCOMMITTED の場合 (NOLOCK の有無にかかわらず SELECT)
トランザクションの完了を待っている 1) ( SELECT が NOLOCK なしの場合のみ) および
- READ COMMITTED 以上 (REPEATABLE READ、SERIALIZABLE) のトランザクション分離レベル
これらの結果は、質問で説明されている状況 (および回答で説明されていますか?) [1]
(たとえば、NOCHECK を指定した SELECT が 1 の完了を待っている) などと 矛盾しています。
私の結果と [1] はどのように説明できますか?
Update2:
この質問は、実際には私の質問 [3] (または回答されていない結果) のサブ質問です。
引用:
[1] SQL Server でのロック動作について説明する
SQL Server でのロック動作について説明する
[2]
「分離 (データベース システム)」
末尾に ) を追加してリンクしてください。ここのリンクでそれを保存することはできません!
http://en.wikipedia.org/wiki/Isolation_(database_systems)
[3]
SQL Server 2005 の SELECT ステートメントのデフォルトは NOLOCK ですか? NOLOCK は SQL Server 2005 の SELECT ステートメントの既定ですか?