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

时间:2015-10-20 09:36:14

标签: .net sql-server tsql snapshot-isolation

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

错误:

  

由于更新冲突导致快照隔离事务中止。您   无法使用快照隔离直接访问表'dbo.Companies'   或间接在数据库'myDatabase'中更新,删除或插入   已被另一个事务修改或删除的行。   重试事务或更改隔离级别   更新/删除声明。

声明:

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

我使用Google搜索并且只发现当我使用SNAPSHOT隔离级别事务时发生错误。但没有交易。

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

有关此错误的任何想法?任何帮助将不胜感激。

谢谢,

1 个答案:

答案 0 :(得分:0)

如Damien所述,update语句使用autocommit事务。

autocommit事务使用上次为连接声明的隔离级别而不是默认隔离级别(请参阅this question)。

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

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

谢谢,Damien!