我有一个启动事务的进程,将记录插入 Table1,然后调用长时间运行的 Web 服务(最多 30 秒)。如果 Web 服务调用失败,则插入回滚(这是我们想要的)。这是插入的示例(实际上是对多个表的多次插入,但我正在简化这个问题):
INSERT INTO Table1 (UserId, StatusTypeId) VALUES (@UserId, 1)
我有第二个过程从第一步查询 Table1,如下所示:
SELECT TOP 1 * FROM Table1 WHERE StatusTypeId=2
然后为用户更新该行。当进程 1 运行时,Table1 被锁定,因此进程 2 将在进程 1 完成之前完成,这是一个问题,因为在进程 1 完成其 Web 服务调用时引入了长时间延迟。
进程 1 只会插入 1 的 StatusTypeId,它也是唯一插入 Table1 的操作。进程 2 只会查询 StatusTypeId = 2。我想告诉进程 2 忽略对 Table1 的任何插入,但锁定它选择的行。Process 2 的默认隔离级别等待太多,但我担心 IsolationLevel.ReadUncommitted 允许读取太多脏数据。我不希望两个用户运行 Process 2 然后意外地获得同一行。
除了 ReadUncommitted 之外,是否还有其他 IsolationLevel 可以使用,它表示忽略插入的行但确保选择锁定了选定的行?