如何锁定.net事务中的相关行
本文关键字:事务 net 何锁定 锁定 | 更新日期: 2023-09-27 18:12:19
我有一个项目表,一个涉众表,和一个关联表(它以ProjectID和一个涉众id作为外键)。
我想删除单个项目,但必须首先删除关联表中该项目的所有行。
方法如下。ProjectRow是一个使用数据集设计器创建的强类型数据集。
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);
}
}
此方法确实达到了所需的效果(在事务期间停止向已删除的项目添加关联),但它似乎在所有表上放置了读写锁,因此我甚至无法在休眠期间从项目表中读取。
我希望能够在事务期间将其他项目/涉众对添加到关联表中。我该如何做到这一点?欢呼。
一些链接,但是你可以暗示你想要行级锁定,数据库引擎可能会或可能不会接受这个建议。然而,由于您让库处理删除,谁知道它在做什么(除了打开分析器和捕获语句)。它很可能是发出表锁,或者您只是不幸地将行锁升级为页锁,并且您试图在事务外的查询中访问的行恰好在同一页上。
-
是可能的强制行级锁定在SQL Server?
-
为什么SQL Server 2008在长事务INSERT's上阻塞SELECT's ?
https://dba.stackexchange.com/questions/6512/difference-between-row-level-and-page-level-locking-and-consequences
身体该怎么做?您需要在并发性需求和坏数据风险之间进行平衡。这是一张关于SQL Server隔离级别的有趣海报