【问题标题】:Sql Server 2005 - manage concurrency on tablesSql Server 2005 - 管理表的并发性
【发布时间】:2008-12-09 13:38:45
【问题描述】:

我在一个 ASP.NET 应用程序中有这个过程:

  • 开始连接
  • 开始交易
  • 使用包含特定 LoadId 的列的 SqlBulkCopy 类向表“LoadData”中插入大量值。
  • 调用存储过程:
    • 读取特定 LoadId 的表“LoadData”。
    • 每行都会进行大量计算,这意味着读取数十个表并将结果写入临时 (#temp) 表(持续几分钟的过程)。
    • 删除“LoadDate”中特定 LoadId 的行。
    • 一切都完成后,将结果写入结果表中。
  • 如果出现问题,提交事务或回滚。

我的问题是,如果我有 2 个用户启动该进程,第二个用户将不得不等待前一个用户完成(因为插入似乎在表上设置了排他锁)并且我的应用程序有时会超时(而且用户不乐意等待:))。

我正在寻找一种方法,让用户能够并行执行所有操作,因为没有交互,除了最后一个:编写结果。我认为阻止我的是“LoadData”表中的插入/删除。 我检查了其他事务隔离级别,但似乎没有任何帮助。

在插入完成但不结束事务的情况下,能够移除“LoadData”表上的排他锁(是否可以强制 SqlServer 只锁定行而不锁定表?)将是完美的.

有什么建议吗?

【问题讨论】:

    标签: sql-server locking


    【解决方案1】:

    在 Books OnLine 中查找 SET TRANSACTION ISOLATION LEVEL READ COMMITTED SNAPSHOT。

    【讨论】:

    • 事务级别READ COMMITTED SNAPSHOT在很多情况下救了我!
    【解决方案2】:

    事务应涵盖小型且快速执行的 SQL/代码。它们倾向于在不同的平台上以不同的方式实现。他们将锁定表,然后随着修改的增加扩展锁定,从而锁定其他用户查询或更新同一行/页/表。

    为什么不忘记事务,并以另一种方式处理处理错误?您的数据完整性是否真正受到交易的保护,或者您可以没有它吗?

    【讨论】:

      【解决方案3】:

      如果您确定除了最后一部分之外 cioncurrent 操作没有问题,为什么不在最后的语句之前开始事务,无论它们是需要隔离的),并在它们成功后立即提交......然后所有的前期读取操作都不会互相阻塞...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        • 2011-11-15
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        相关资源
        最近更新 更多