1

我在执行 UPDATE 语句时遇到错误。

错误:

由于更新冲突,快照隔离事务中止。您不能使用快照隔离直接或间接访问数据库“myDatabase”中的表“dbo.Companies”来更新、删除或插入已被另一个事务修改或删除的行。重试事务或更改更新/删除语句的隔离级别。

陈述:

UPDATE [ActiveSession] SET [LastActionExecutedAt] = GETDATE() WHERE [SessionID]=@id

我通过 ASP.NET 应用程序运行上述语句。

奇怪的是该语句是在没有事务的情况下执行的。代码如下:

using(var sqlconn = new SqlConnection("connection string")
using(var sqlcmd = sqlconn.CreateCommand())
{
    sqlconn.Open();
    sqlcmd.Parameters.Add("@id", SqlDbType.NVarChar).Value = id;

    sqlcmd.CommandText = "SELECT * FROM [ActiveSession] WHERE @id=id";
    using(var sqlreader = sqlcmd.ExecuteReader())
    {
        // read info
        reader.Close();
    }

    sqlcmd.CommandText = "UPDATE ....";
    Sqlcmd.ExecuteNonQuery();
}

我用谷歌搜索,只发现当我使用 SNAPSHOT 隔离级别事务时发生错误。但是没有交易。

该线程中所述,索引在某些情况下会有所帮助,但这对我没有帮助。

关于这个错误的任何想法?任何帮助将不胜感激。

谢谢,

4

1 回答 1

0

正如 Damien 所述,更新语句使用自动提交事务。

自动提交事务使用上次为连接声明的隔离级别,而不是默认隔离级别(请参阅此问题)。

此行为使更新语句在 READ COMMITTED 和 SNAPSHOT 隔离级别下执行,这就是发生更新冲突的原因。

似乎这个问题在 SQL Server 2014 CU6 中已修复,但我仍然使用 2008 R2 :(

谢谢,达米安!

于 2015-10-22T02:46:02.317 回答