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

时间:2019-01-25 09:26:51

标签: sql sql-server transactions snapshot-isolation

  

快照更新事务由于更新冲突而中止。您   无法使用快照隔离来直接或间接访问表   在数据库中更新,删除或插入已经存在的行   被另一笔交易修改或删除。重试交易或   更改更新/删除语句的隔离级别。

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

如果我尝试使用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"
        }
        }

现在,如果在完成上述转换提交之前我还对employee表执行更新,它将引发以上错误。我不知道为什么,因为这只是select语句。我读过Microsoft博客,这会造成问题,但在任何地方都找不到解决方案。

update employee set IsActive = 1 where type = 1

1 个答案:

答案 0 :(得分:0)

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