私はプロジェクトテーブル、ステークホルダテーブル、およびアソシエーションテーブル(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);
}
}
この方法は、(トランザクション中に削除されたプロジェクトに追加された関連付けを停止する)必要な効果を実現しますが、読み取りを配置し、私もプロジェクト表から読み取ることができませんので、すべてのテーブルのロックを書くように見えます睡眠期間中に。
トランザクション中に他のプロジェクト/ステークホルダーペアをアソシエーションテーブルに追加したいと考えています。これをどのように達成するのですか? 乾杯。
テーブルの関連付けを変更できる場合は、「カスケードを削除する」を参照してください。これはコードソリューションではありませんが、考慮する可能性のあるものです。 – Tipx
http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspx –