2011-01-18 7 views
1

.NETからSQL Serverを使用すると、(同じ接続または別の接続を使用して)基になるデータと、下位トランザクションデータとコミットされていないトランザクションデータの両方を読み取る

例えば

私は、トランザクションを開始し、テーブルに、id == 1でレコードを挿入するが、接続2からそれを

をコミットしていない接続1を、持っている、私が読みたいです既存の行がないテーブル

Connection2またはConnection3から、行が存在するテーブルを読みたいと思います。あなたは一つの接続で「スナップショット分離」の組み合わせを必要とし、「非コミット読み取り」たいデータの両方のセットを読み取るには

+0

gbnが正解です。しかし、私はあなたに警告する必要があります - パフォーマンス上の理由から私はこの道を数年前に下ってしまい、問題を引き起こしました。クエリを高速化しようとすると、クエリにもっと時間を費やし、SQL Serverでロックを適切に実行させることができます。 – n8wrl

+0

なぜですか?それぞれの接続は他のトランザクションを気にするべきではありません。 – gbn

+0

それは[this](http://stackoverflow.com/questions/4725512/)を実装することでしたが、今は別の解決策をとってきました。 – enashnash

答えて

0

はい、あなたは汚れを有効にする必要が別名UNCOMMITTED

編集を読んで読み込み、別の

YMMV。それは何か...私が試した

  1. 、あなたは内のコミットされていないデータを確認することができ、あなたが知っているように、私は
+0

私はコミットされていない変更を読むことを許可するREAD UNCOMMITTEDを知っていますが、私の質問がはっきりしないかもしれないと思うので、私はそれを更新しました。問題は、SAMEトランザクションの基になる変更とコミットされていない変更の両方にアクセスできるかどうかです。 – enashnash

+0

私はこれを答えとしてマークしましたが、私の質問で最後に尋ねたことは進んでいませんでした。 – enashnash

0

に自信を持っていると思います

  • のための使用を参照してください
  • ではありませんそのような現在のセッション:あなたはこのコミットされていないデータを参照できるようにしたかったことを、別の接続をオープンする場所

    CREATE TABLE TestTable 
    (
        ID int not null 
    ); 
    
    INSERT INTO TestTable(ID) values(1); 
    INSERT INTO TestTable(ID) values(2); 
    INSERT INTO TestTable(ID) values(3); 
    
    SELECT * FROM TestTable; 
    
    BEGIN TRANSACTION 
    
        INSERT INTO TestTable(ID) values(4); 
        INSERT INTO TestTable(ID) values(5); 
    
        --Although the transaction has not commited you can still see the records inserted from within the current sessions scope. 
        SELECT * FROM TestTable; 
    
    
    COMMIT TRANSACTION 
    
    DROP TABLE TestTable; 
    

    は今、あなたを想定します。クエリのヒントでは、NOLOCKクエリヒントを使用してクエリレベルで行うことができます。たとえば、

    SELECT * FROM TestTable WITH(NOLOCK) 
    
  • 関連する問題