1

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

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

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

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

当插入完成但不结束事务时,能够删除“LoadData”表上的排他锁(是否可以强制 SqlServer 仅锁定行而不锁定表?)将是完美的。

有什么建议吗?

4

3 回答 3

1

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

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

于 2008-12-09T13:43:02.617 回答
1

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

于 2008-12-09T14:04:30.297 回答
1

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

于 2008-12-09T14:24:56.183 回答