5

質問[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 ステートメントの既定ですか?






4

2 に答える 2

2

SQL 2008 でヒントをロックすることについて彼女が話している便利なMSDNリンクがあります。おそらく、あなたの例では、SQL Server 2008 がテーブルのロックを嫌っていますか?

(以下のリンクの次のスニペットは、SQL Server 2008 によって無視される可能性があるロックについて説明しています)

次の例に示すように、トランザクション分離レベルが SERIALIZABLE に設定されており、テーブル レベルのロック ヒント NOLOCK が SELECT ステートメントで使用されている場合、シリアル化可能なトランザクションを維持するために通常使用されるキー範囲ロックは取得されません

CopyUSE AdventureWorks2008R2;
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO
BEGIN TRANSACTION;
GO
SELECT Title
    FROM HumanResources.Employee WITH (NOLOCK);
GO

-- Get information about the locks held by 
-- the transaction.
SELECT  
        resource_type, 
        resource_subtype, 
        request_mode
    FROM sys.dm_tran_locks
    WHERE request_session_id = @@spid;

-- End the transaction.
ROLLBACK;
GO

HumanResources.Employee を参照する唯一のロックは、スキーマ安定性(Sch-S) ロックです。この場合、直列化可能性は保証されなくなります。

SQL Server 2008 では、A LTER TABLE の LOCK_ESCALATION オプションがテーブル ロックを無効にし、パーティション テーブルで HoBT ロックを有効にすることができます。このオプションはロックのヒントではありませんが、ロックのエスカレーションを減らすために使用できます。詳細については、「ALTER TABLE (Transact-SQL)」を参照してください。

于 2010-10-08T12:43:16.293 に答える
1

2番目のクエリのヒントは、トランザクション分離レベルを上書きします。
SELECT ... WITH (NOLOCK)基本的にはと同じですSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT ...

他の分離レベルでは、ロックが尊重されるため、2番目のトランザクションは、最初のトランザクションによってロックが解放されるまで待機します。

于 2010-10-08T14:21:50.900 に答える