Sql Server 2005 - 管理表的并发性

时间:2008-12-09 13:38:46

标签: sql-server locking

我在ASP.NET应用程序中遇到了这个过程:

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

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

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

什么是完美的将是能够删除“LoadData”表上的独占锁(是否可以强制SqlServer只锁定行而不是表?)插入完成后,但没有结束事务

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

事务应该包括小而快速执行的SQL /代码。它们具有在不同平台上以不同方式实现的趋势。它们将锁定表,然后随着修改的增加扩展锁定,从而锁定其他用户查询或更新相同的行/页/表。

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

答案 1 :(得分:1)

在线上书籍中查找SET TRANSACTION ISOLATION LEVEL READ COMMITTED SNAPSHOT。

答案 2 :(得分:1)

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