Questions tagged «deadlock»

两个(或多个)操作需要重叠的资源集,而两个都不能完成的情况,因为它们无法获得完成一个操作并释放其锁所需的所有锁。

22
在SQL Server 2005中诊断死锁
我们在Stack Overflow SQL Server 2005数据库中看到了一些有害但罕见的死锁情况。 我附加了事件探查器,并使用这篇有关解决死锁的出色文章来建立跟踪配置文件,并捕获了许多示例。奇怪的是,死锁写入总是相同的: UPDATE [dbo].[Posts] SET [AnswerCount] = @p1, [LastActivityDate] = @p2, [LastActivityUserId] = @p3 WHERE [Id] = @p0 其他死锁语句有所不同,但通常是对posts表的一些琐碎,简单的读取。这个总是在僵局中被杀死。这是一个例子 SELECT [t0].[Id], [t0].[PostTypeId], [t0].[Score], [t0].[Views], [t0].[AnswerCount], [t0].[AcceptedAnswerId], [t0].[IsLocked], [t0].[IsLockedEdit], [t0].[ParentId], [t0].[CurrentRevisionId], [t0].[FirstRevisionId], [t0].[LockedReason], [t0].[LastActivityDate], [t0].[LastActivityUserId] FROM [dbo].[Posts] AS [t0] WHERE [t0].[ParentId] = @p0 确切地说,我们没有看到写/写死锁,而是看到了读/写。 目前,我们混合使用LINQ和参数化SQL查询。我们已经添加with (nolock)了所有的SQL查询。这可能有所帮助。我昨天还修复了一个(非常)写得不好的徽章查询,每次都要花费20秒以上的时间,而且每分钟都在运行。我希望这是一些锁定问题的根源! 不幸的是,大约2小时前,我又遇到了一个死锁错误。同样的症状,同样的罪魁祸首。 …

4
如何解决SQL Server错误1222,即解锁SQL Server表
我在一个数据库中工作,在该数据库中,我通过数据加载器将数据加载到原始表中。但是今天,数据加载器由于未知原因而卡住了。然后,我从Windows任务管理器中停止了数据加载器。但是随后我再次尝试将数据加载到原始表中,但发现其已锁定,并且无法对其进行任何操作。我尝试重新启动SQL Server服务,但未解决。而且我无权杀死该服务器上的进程。 下面是SQL Server显示的消息。 执行Transact-SQL语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo) 计划地点: 在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串的SqlCommand,ExecutionTypes executionType) 在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands,ExecutionTypes executionType) 在Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery (StringCollection查询) 在Microsoft.SqlServer.Management.Smo.SqlSmoObject.ExecuteNonQuery(StringCollection查询,布尔includeDbContext) 在Microsoft.SqlServer.Management.Smo.NamedSmoObject.RenameImplWorker(String newName) 在Microsoft.SqlServer.Management.Smo.NamedSmoObject。 RenameImpl(String newName) ================================== 超过了锁定请求超时期限。参数@objname不明确或声明的@objtype(OBJECT)错误。(.Net SqlClient数据提供程序) 服务器名称:162.44.25.59错误号:1222 严重性:16状态:56 过程:sp_rename行号:282 我的SQL Server版本是2008 R2。

2
访问StackExchange.Redis时出现死锁
调用StackExchange.Redis时,我陷入了僵局。 我不知道到底是怎么回事,这非常令人沮丧,我将感谢您提供任何有助于解决或解决此问题的建议。 如果您也有这个问题,并且不想阅读所有这些内容; 我建议您尝试设置PreserveAsyncOrder为false。 ConnectionMultiplexer connection = ...; connection.PreserveAsyncOrder = false; 这样做可能会解决此Q&A即将发生的僵局,并且还可以提高性能。 我们的设置 该代码既可以作为控制台应用程序运行,也可以作为Azure工作者角色运行。 它使用HttpMessageHandler公开REST api,因此入口点是异步的。 代码的某些部分具有线程相似性(由单个线程拥有,并且必须由单个线程运行)。 代码的某些部分是仅异步的。 我们正在做异步同步和异步同步的反模式。(混合await和Wait()/ Result)。 访问Redis时,我们仅使用异步方法。 我们将.NET 4.5使用StackExchange.Redis 1.0.450。 僵局 当应用程序/服务启动时,它会正常运行一段时间,然后突然(几乎)所有传入请求停止运行,它们永远不会产生响应。所有这些请求都陷入僵局,等待对Redis的调用完成。 有趣的是,一旦发生死锁,对Redis的任何调用都将挂起,但前提是这些调用是由在线程池上运行的传入API请求进行的。 我们还从低优先级的后台线程对Redis进行了调用,即使死锁发生后,这些调用仍继续起作用。 似乎只有在线程池线程上调用Redis时才会发生死锁。我不再认为这是由于这些调用是在线程池线程上进行的。而是,即使发生死锁情况,似乎任何没有继续执行或具有同步安全继续执行的异步Redis调用都将继续起作用。(请参阅下面我的看法) 有关 StackExchange.Redis死锁 混合await和Task.Result(像我们这样,异步同步)导致死锁。但是我们的代码在没有同步上下文的情况下运行,因此不适用于这里,对吧? 如何安全地混合同步和异步代码? 是的,我们不应该那样做。但是我们这样做了,我们将不得不继续这样做一段时间。许多代码需要迁移到异步世界中。 同样,我们没有同步上下文,因此这不应引起死锁,对吗? 设置ConfigureAwait(false)之前await没有任何影响。 异步命令和Task.WhenAny在StackExchange.Redis中等待后发生超时异常 这是线程劫持问题。目前情况如何?这可能是问题所在吗? StackExchange.Redis异步调用挂起 从马克的答案: ...混合等待和等待不是一个好主意。除了死锁,这是“异步同步”-一种反模式。 但是他也说: SE.Redis内部绕过同步上下文(对于库代码而言是正常的),因此它不应具有死锁 因此,据我了解,StackExchange.Redis应该与我们是否使用sync-over-async反模式无关。只是不建议这样做,因为它可能是其他代码中死锁的原因。 但是,据我所知,在这种情况下,死锁确实在StackExchange.Redis内部。如果我错了,请纠正我。 调试结果 我发现僵局似乎有其源ProcessAsyncCompletionQueue上的124线CompletionManager.cs。 该代码段: while (Interlocked.CompareExchange(ref …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.