2017-12-15 16 views
4

テーブルを更新しようとしていますが、これはアプリケーションを制御します(アプリケーションはいくつかのselect文を実行します)。私は、コミットされていない読み取りに設定された分離レベルでトランザクションのテーブルを更新したいので、アプリケーションが期待どおりに動作しない場合、トランザクションをロールバックできます。SQL Serverのトランザクション分離レベル

しかし、次のコードは動作しません:私は別のクエリウィンドウを開くと

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
go 

begin transaction 
go 

update [DB].[dbo].[Table] 
set ID = ID - 281 
where ID > 2 

、私はこのテーブルを照会することはできません...私は思った、そのようなトランザクションレベルで、私はテーブルを照会することができるだろうということロールバック/トランザクションのコミットなし。

+1

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

を設定する必要があなたの選択では、このトランザクションからコミットされていないデータを表示したい場合は、最後にコミットやロールバックを忘れていませんか? – Magnus

+0

uは更新クエリの代わりに選択クエリで同じヒントを与えようとしました –

答えて

3

分離レベルは、想定どおりに機能します。

コミットされていないデータは読み取ることができますが、コミットするまでトランザクション内で行った処理はまだ分かりません。

あなたはこの選択

+1

このクエリによって、アプリケーション内の他のコミットされていないデータも読み取られるため、注意が必要です。 – Magnus

+0

答えをありがとう。それは問題を解決します。 –

+1

@Magnus真実、汚れた読みは危険なので注意してください。チャンスがある場合は、それらを回避しようとすることができます。 – jabko87

3

データを読み取るセッションからSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDを使用する必要があります。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

SELECT * 
FROM [DB].[dbo].[Table] 

このクエリはロックなしで直ちに実行されます。汚いデータが表示されます。

+0

回答ありがとうございます。それは問題を解決するが、私は2つの答えを受け入れることができません:(しかしupvoted。 –

+0

問題はありません;)私の答えの投票ありがとう! – Leran2002

関連する問題