gpt4 book ai didi

c# - 如何只锁定 .NET 事务中的相关行

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:39 25 4
gpt4 key购买 nike

我有一个项目表、一个利益相关者表和一个关联表(将 ProjectID 和 StakeholderID 作为外键)。

我想删除单个项目,但必须先删除关联表中该项目的所有行。

这是方法。 ProjectRow 是使用 DataSet Designer 创建的强类型数据行。

 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);
}
}

这个方法确实达到了需要的效果(停止在事务中将关联添加到已删除的项目)但是它似乎在所有表上放置了读写锁所以我什至无法在 sleep 期间从项目表中读取.

我希望能够在交易期间将其他项目/利益相关者对添加到关联表。我如何实现这一目标?干杯。

最佳答案

一些链接,但您可以暗示您想要行级锁定,数据库引擎可能会也可能不会采纳该建议。但是,由于您让库处理删除,谁知道它在做什么(除了打开探查器和捕获语句)。它很可能是发出表锁,或者您只是不幸地将行锁升级为页锁,并且您在事务外的查询中尝试访问的行恰好在同一页上。

body 有什么用?您需要在并发需求与坏数据风险之间取得平衡。这是关于 SQL Server Isolation Levels 的有趣海报

关于c# - 如何只锁定 .NET 事务中的相关行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7897818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com