由于选定行的更新冲突,快照隔离事务中止

Snapshot isolation transaction aborted due to update conflict for selected rows

Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table directly or indirectly in database to update, delete, or insert the row that has been modified or deleted by another transaction. Retry the transaction or change the isolation level for the update/delete statement.

我阅读了这里提到的其他问题,但我的有点不同,我只是想用 select 语句读取一些数据,但是如果那些 selected 行在外部被另一个事务更新,那么我得到上面的冲突错误。

如果我尝试使用 LDPLOCK 提示,那么它可以工作,但会减慢速度。有什么解决办法吗?

下面是实际例子。

using (SqlConnection cn = new SqlConnection(connectionString))
                {
                    await cn.OpenAsync();
                    using (SqlTransaction tran = cn.BeginTransaction(System.Data.IsolationLevel.Snapshot))
                    {
            "select top 10 * from Employee where type = 1"
        }
        }

现在,如果我在完成上述事务提交之前也对员工 table 执行更新,则会抛出上述错误。我不确定为什么,因为它只是 select 语句。我在微软博客上看到这会产生问题,但无法在任何地方找到解决方案。

update employee set IsActive = 1 where type = 1

原来我无法对正在快照隔离事务中使用的 table 进行更新。我将我的 table 分成两部分,将我需要更新的列移到第二个 table 并且没有添加任何 FK 关系。它解决了问题。