如何锁定.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);
        }
    }

此方法确实达到了所需的效果(在事务期间停止向已删除的项目添加关联),但它似乎在所有表上放置了读写锁,因此我甚至无法在休眠期间从项目表中读取。

我希望能够在事务期间将其他项目/涉众对添加到关联表中。我该如何做到这一点?欢呼。

如何锁定.net事务中的相关行

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

  • 是可能的强制行级锁定在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隔离级别的有趣海报