none
トランザクション中のSELECT方法 RRS feed

  • 質問

  • トランザクションをかけている間、更新クエリーは流せるのですが、
    セレクト文の取得が出来ません。

    更新側は
    ExecuteNonQueryで更新しています。

    SELECT側は
    SqlDataAdapterでFillしてDataTableで取得使用として出来ません。


    トランザクション中は参照出来ないのでしょうか?

    宜しくお願いします。

    2010年10月28日 4:19

回答

  • トランザクション(または分離レベル)の種類にもよります。ダーティーリードやファントムなどが発生して良いのであれば、適切な分離レベルを選択されると良いと思います。

    (参考)
    連載:SQL実践講座(27)
    トランザクションの一貫性を保証するロック
    http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク TAKAPI 2010年11月7日 1:24
    2010年10月28日 5:38
  • A トランザクションで A テーブルを更新中に、B トランザクションで、A テーブルを検索(SELECT) した場合、 A トランザクション上で、更新対象のキーに対して X ロックが取得されるため、B トランザクションで X ロックを取得されている行に対して、検索が行なわれた場合、共有ロック(S) を取得することができず、待ち状態になると思います。

    コミットされていないデータを読み取っても良いのであれば、nolock ヒント句をSELECT文につけると、検索で待ち状態は発生しないと思いますよ。

    また、SQL Server 2005 以降であれば、Read_committed_Snapshot を有効にすれば、SELECT文で 共有ロックが取得されないので、検索で待ち状態は発生しないと思います。

    行のバージョン管理に基づく分離レベルの有効化
    http://msdn.microsoft.com/ja-jp/library/ms175095.aspx

    行のバージョン管理に基づく分離レベルについて
    http://msdn.microsoft.com/ja-jp/library/ms189050.aspx

    • 回答としてマーク TAKAPI 2010年11月7日 1:24
    2010年11月2日 11:41

すべての返信

  • トランザクション(または分離レベル)の種類にもよります。ダーティーリードやファントムなどが発生して良いのであれば、適切な分離レベルを選択されると良いと思います。

    (参考)
    連載:SQL実践講座(27)
    トランザクションの一貫性を保証するロック
    http://www.atmarkit.co.jp/fnetwork/rensai/sql27/sql1.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク TAKAPI 2010年11月7日 1:24
    2010年10月28日 5:38
  • >トランザクションをかけている間、更新クエリーは流せるのですが、
    >セレクト文の取得が出来ません。


    分離レベルとかどのようなロックヒントをどうしてるかによりますが、普通は逆になることの方が多いです(Select できるが更新できない)。

    どのような分離レベルで、どのようなクエリを書いているのでしょうか?
    2010年10月28日 6:16
  • A トランザクションで A テーブルを更新中に、B トランザクションで、A テーブルを検索(SELECT) した場合、 A トランザクション上で、更新対象のキーに対して X ロックが取得されるため、B トランザクションで X ロックを取得されている行に対して、検索が行なわれた場合、共有ロック(S) を取得することができず、待ち状態になると思います。

    コミットされていないデータを読み取っても良いのであれば、nolock ヒント句をSELECT文につけると、検索で待ち状態は発生しないと思いますよ。

    また、SQL Server 2005 以降であれば、Read_committed_Snapshot を有効にすれば、SELECT文で 共有ロックが取得されないので、検索で待ち状態は発生しないと思います。

    行のバージョン管理に基づく分離レベルの有効化
    http://msdn.microsoft.com/ja-jp/library/ms175095.aspx

    行のバージョン管理に基づく分離レベルについて
    http://msdn.microsoft.com/ja-jp/library/ms189050.aspx

    • 回答としてマーク TAKAPI 2010年11月7日 1:24
    2010年11月2日 11:41
  • SqlClient.SqlDataAdapterでFillしてできなかったので、 System.Data.SqlClient.SqlCommandで、

    ExecuteReaderで、SqlDataReaderでselect参照がうまくとれました。みなさんありがとうございました。

    2010年11月7日 1:23