Tag: 死锁

TransactionScope过早完成

我有一个在TransactionScope中运行的代码块,在这个代码块中,我对数据库进行了几次调用。 select,更新,创build和删除整个色域。 当我执行我的删除我执行它使用SqlCommand的扩展方法,将自动重新提交查询,如果它死锁,因为这个查询可能会遇到死锁。 我相信当遇到死锁,并且该函数试图重新提交查询时,会发生此问题。 这是我收到的错误: 与当前连接相关的交易已经完成但尚未处理。 事务必须在连接可以用来执行SQL语句之前进行处理。 这是执行查询的简单代码(下面的所有代码都是在使用TransactionScope的情况下执行的): using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.App)) { sqlCommand.Connection.Open(); sqlCommand.ExecuteNonQueryWithDeadlockHandling(); } 以下是重新提交死锁查询的扩展方法: public static class SqlCommandExtender { private const int DEADLOCK_ERROR = 1205; private const int MAXIMUM_DEADLOCK_RETRIES = 5; private const int SLEEP_INCREMENT = 100; public static void ExecuteNonQueryWithDeadlockHandling(this SqlCommand sqlCommand) { int count = 0; SqlException deadlockException = […]

一个进程成为死锁受害者的原因

我有一个select过程需要很长时间才能完成,大约5到10分钟。 我目前不使用NOLOCK作为MS SQL数据库引擎的提示。 同时我们有另一个进程进行更新并插入到相同的数据库和相同的表中。 第一个过程已经开始,最近过早地结束了一个信息 SQLEXCEPTION:事务在另一个进程的锁资源上死锁,并被选为死锁受害者。 这个第一个进程在相同条件下的其他站点运行,但数据库较小,因此select语句花费的时间要短得多(大约30秒左右)。 在这些其他网站中,我没有在这些其他网站上看到死锁消息。 我也没有在最初出现问题的网站上得到这个消息,但是,我认为,随着数据库的增长,我相信我必须跨越一些门槛。 这是我的问题: 执行事务所花费的时间是否会使关联进程更可能被标记为死锁受害者。 如果我用NOLOCK提示执行select,这是否会解决问题? 我怀疑select语句中作为WHERE子句的一部分检查的date时间字段正在导致查询时间慢。 我可以根据这个字段创build一个索引吗? 这是可取的吗?

为什么在静态初始化器中使用lambda进行并行stream导致死锁?

我遇到了一个奇怪的情况,在静态初始化器中使用带有lambda的并行stream看似永远没有CPU利用率。 代码如下: class Deadlock { static { IntStream.range(0, 10000).parallel().map(i -> i).count(); System.out.println("done"); } public static void main(final String[] args) {} } 这似乎是这种行为的最小再现testing案例。 如果我: 把该块放在主要的方法而不是一个静态初始化器, 删除并行,或 删除lambda, 代码即刻完成。 任何人都可以解释此行为? 这是一个错误还是这是打算? 我正在使用OpenJDK版本1.8.0_66内部。

如何捕获由死锁引起的SqlException?

从.NET 3.5 / C#应用程序,我想赶上SqlException但只有当它是由 SQL Server 2008实例上的死锁引起的 。 典型的错误消息是Transaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Transaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 但是,这个exception似乎没有logging在错误代码中。 […]

简单的死锁例子

我想解释给新手解决死锁问题。 过去我见过很多死锁的例子,有的使用代码,有的使用插图(比如着名的4辆汽车 )。 也有经典的容易僵化的问题,如餐饮哲学家 ,但这些可能太复杂,真正的新手要完全掌握。 我正在寻找最简单的代码示例来说明什么是死锁。 这个例子应该: 相关的是一个“真实”的编程场景,这是有道理的 非常简短,直截了当 你有什么build议?

什么是僵局?

在编写multithreading应用程序时,遇到的最常见问题之一是死锁。 我对社区的问题是: 什么是僵局? 你如何检测他们? 你处理他们? 最后,你如何防止它们发生?

死锁和livelock有什么区别?

有人可以请示例(代码)解释死锁和livelock之间的区别是什么?

写一个肯定会陷入僵局的程序

我最近在采访中得到了这个问题。 我回答说,如果交错发生,就会发生死锁,但是采访者坚持认为,一个程序总是会陷入僵局,而不pipe交错如何。 我们可以写这样的程序吗? 你能指点我一些这样的例子程序?

诊断SQL Server 2005中的死锁

在Stack Overflow SQL Server 2005数据库中,我们看到了一些有害的但罕见的死锁条件。 我附上了剖析器,使用这篇关于解决死锁的优秀文章设置了一个跟踪configuration文件,并捕获了一堆示例。 奇怪的是, 死锁的写法总是一样的 : UPDATE [dbo].[Posts] SET [AnswerCount] = @p1, [LastActivityDate] = @p2, [LastActivityUserId] = @p3 WHERE [Id] = @p0 另一个死锁陈述各不相同,但通常是一些简单的,简单的阅读post表。 这个人总是在僵局中遇难。 这是一个例子 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查询。 […]

你会解释locking顺序吗?

我了解到,我应该解锁相反的顺序来locking订单。 例如。 A.lock(); B.lock(); B.unlock(); A.unlock(); 但是,如果我这样做会发生什么: A.lock(); B.lock(); A.unlock(); B.unlock(); 我试图做一个死锁的情况,但如果我总是先lockingA然后B,那么我不知道会发生什么样的死锁。 你能帮我吗?