运行Microsoft SQL 2012标准,无压缩,无分区。 在Windows Server 2008 R2上运行。 我的加载程序是VS C#2013,纯64位,.NET 4.5.2 我使用Dapper 1.42作为我的ORM。 我不使用提交/回滚/事务逻辑,这些只是简单的插入。
在加载程序的顶部,我发出了“SET RECOVERY SIMPLE' (这样做是为了尝试解决这个问题)。
加载器读取.csv,对数据进行一些处理,然后进行插入,实际上是程序的最简单形式,它只需要几行代码。加载器从不进行选择。加载程序是此服务器(测试服务器)上运行的唯一进程。加载器不是多线程的。我在插入时执行commandtimeout = 0.
我不断地继续获得'事务(进程ID xx)在锁资源上与另一个进程陷入僵局,并被选为死锁牺牲品。重新运行交易'。
错误听起来很明显,它说我有两个进程在运行,其中一个是死锁。但我在测试服务器上,我是唯一的用户,没有其他进程在运行。
我不知道如何调试它。在我的' catch'声明,我发出这个SQL命令来捕获正在运行的其他内容,但是每次出现错误时它都显示NOTHING正在运行。所以如果什么都没有运行,为什么我一直在插入死锁?
SoapEnvelope
答案 0 :(得分:0)
在我的'catch'语句中,我发出此SQL命令以捕获正在运行的其他内容
发生死锁时,受害者事务将被回滚。这将释放所有锁,从而允许竞争交易继续。只有在回滚完成后,控件才会返回到受害者会话并引发异常。到catch
运行时,并发进程可能已完成。
你要做的事情从根本上说是错误的。更不用说,您已经拥有捕获死锁信息的方法:
并且,作为最后一期:sys.dm_exec_sessions
permissions:
如果用户在服务器上具有VIEW SERVER STATE权限,则用户将在SQL Server实例上看到所有正在执行的会话;否则,用户只会看到当前会话。