我有一个 ASP.NET 应用程序这个过程:
- 开始连接
- 开始交易
- 使用包含特定 LoadId 的列的 SqlBulkCopy 类将大量值插入到表“LoadData”中。
- 调用一个存储过程:
- 阅读特定 LoadId 的表“LoadData”。
- 对于每一行进行大量计算,这意味着读取数十个表并将结果写入临时(#temp)表(持续几分钟的过程)。
- 删除特定 LoadId 的“LoadDate”中的行。
- 一切完成后,将结果写入结果表中。
- 如果发生故障,提交事务或回滚。
我的问题是,如果我有 2 个用户启动该进程,第二个用户将不得不等待前一个用户完成(因为插入似乎在表上设置了排他锁)并且我的应用程序有时会超时(并且用户不乐意等待 :) )。
我正在寻找一种方法,让用户能够并行执行所有操作,因为没有交互,除了最后一个:编写结果。我认为阻止我的是“LoadData”表中的插入/删除。我检查了其他事务隔离级别,但似乎没有什么可以帮助我。
当插入完成但不结束事务时,能够删除“LoadData”表上的排他锁(是否可以强制 SqlServer 仅锁定行而不锁定表?)将是完美的。
有什么建议吗?