快照隔离事务因更新冲突而中止,但没有事务开始

Snapshot Isolation Transaction aborted due to update conflict, but no transaction begins

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

错误:

Snapshot isolation transaction aborted due to update conflict. You cannot use snapshot isolation to access table 'dbo.Companies' directly or indirectly in database 'myDatabase' 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.

声明:

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

我运行以上声明通过ASP.NET申请。

奇怪的是,该语句是在没有 t运行saction 的情况下执行的。 代码如下:

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();
}

我google了一下,只发现错误发生在我使用SNAPSHOT隔离级别t运行saction时。但是没有 t运行saction.

this thread所述,INDEXING在某些情况下会有所帮助,但这对我没有帮助。

知道这个错误吗?任何帮助将不胜感激。

谢谢,

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

自动提交事务使用上次为连接声明的隔离级别而非默认隔离级别(参见 )。

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

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

谢谢达米恩!