none
为什么我执行更新单张表的记录c操作都会出现事务死锁异常,而且我提交的不是事务,是ExecuteNonQuery操作 RRS feed

  • 问题

  • SQL: update scanRecord set cliped=1 where id=1044504

    2014-10-11 11:47:10,117 
     - 事务(进程 ID 112)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
    System.Data.SqlClient.SqlException: 事务(进程 ID 112)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
       在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
       在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
       在 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       在 Aorange.ClipService.MSSQLDataProvider.ExecuteNonQuery(String sql) 位置 

    2014年10月15日 9:49

答案

  • LZ你好,你可以打开跟踪标志让sqlserver去记录死锁的信息,然后你可以吧错误日志里面的死锁信息贴上来,大家分析一下

    DBCC TRACEON(1204,-1)
    GO
    DBCC TRACEON(1222,-1)
    GO
    
     --Trace Flag 1204和1222这两个跟踪标记都是将死锁写到错误日志中



    2014年10月15日 14:30
  • 更新操作始终是在事务中的,如果你没有显式使用事务,那么也会隐式自动开事务

    另外,死锁是锁的问题,不是事务的问题,只要存在两个或者以上的session在互相等待对方的锁资源释放,就会死锁,也就是说,查询都可能死锁的

    建议你使用楼上几位提到的方法分析死锁的原因

    2014年10月16日 2:09

全部回复

  • Enable deadlock trace to get details.
    2014年10月15日 13:04
  • LZ你好,你可以打开跟踪标志让sqlserver去记录死锁的信息,然后你可以吧错误日志里面的死锁信息贴上来,大家分析一下

    DBCC TRACEON(1204,-1)
    GO
    DBCC TRACEON(1222,-1)
    GO
    
     --Trace Flag 1204和1222这两个跟踪标记都是将死锁写到错误日志中



    2014年10月15日 14:30
  • 如果是2008或者之后版本的话可以通过使用默认system_health分析死锁(Deadlock) 找到死锁信息,不用开TraceFlag. 如果之前版本如桦仔说的加1222和1204的TraceFlag.


    Please Mark As Answer if it is helpful.

    2014年10月16日 1:22
  • 是的,最低版本要求是sql2008 扩展事件,不过有一点target最好选择文件,否则服务器重启,信息就会丢失,毕竟ring_buffer环形缓冲区是在内存中的
    2014年10月16日 1:34
  • 更新操作始终是在事务中的,如果你没有显式使用事务,那么也会隐式自动开事务

    另外,死锁是锁的问题,不是事务的问题,只要存在两个或者以上的session在互相等待对方的锁资源释放,就会死锁,也就是说,查询都可能死锁的

    建议你使用楼上几位提到的方法分析死锁的原因

    2014年10月16日 2:09