2011-10-26 8 views
1

私はプロジェクトテーブル、ステークホルダテーブル、およびアソシエーションテーブル(ProjectIDとStakeholderIDを外部キーとして扱います)を持っています。.NETトランザクションで関連する行だけをロックする方法

1つのプロジェクトを削除したいが、関連テーブルのすべてのプロジェクトの行を最初に削除する必要があります。

ここにその方法があります。 ProjectRowは、データセットデザイナーで作成された厳密に型指定されたDataRowです。

public void RemoveProject(ProjectRow project) 
    { 
     try 
     { 
      var associations = from a in ds.Association.AsEnumerable() 
           where a.Project == project.ProjID 
           select a; 
      foreach (DataRow assoc in associations) 
      { 
       assoc.Delete(); 
      } 

      project.Delete(); 

      using (TransactionScope scope = new TransactionScope()) 
      { 
       assocTableAdapter.Update(ds.Association); 

       System.Threading.Thread.Sleep(40000); // to test the transaction. 

       projTableAdapter.Update(ds.Project); 

       scope.Complete(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 

この方法は、(トランザクション中に削除されたプロジェクトに追加された関連付けを停止する)必要な効果を実現しますが、読み取りを配置し、私もプロジェクト表から読み取ることができませんので、すべてのテーブルのロックを書くように見えます睡眠期間中に。

トランザクション中に他のプロジェクト/ステークホルダーペアをアソシエーションテーブルに追加したいと考えています。これをどのように達成するのですか? 乾杯。

+0

テーブルの関連付けを変更できる場合は、「カスケードを削除する」を参照してください。これはコードソリューションではありませんが、考慮する可能性のあるものです。 – Tipx

+1

http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspx –

答えて

2

いくつかのリンクがありますが、行レベルのロックが必要であることを示唆している可能性があります。また、データベースエンジンは提案を受け入れるかもしれません。しかし、あなたがライブラリが削除を処理するようにしているので、それは何をしているのか分かっています(プロファイラを有効にして文を取り込むのには不十分です)。テーブルロックを発行している可能性があります。または、行ロックの不幸がページロックにエスカレートし、トランザクション外のクエリでアクセスしようとしている行が同じページに存在する可能性があります。

行うには、本体とは何ですか?並行性のニーズと悪いデータのリスクとのバランスを取る必要があります。ここに楽しいポスターがありますSQL Server Isolation Levels

関連する問題