问题标签 [deadlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1230 浏览

java - C3p0 中的锁排序

我正在尝试使用 c3p0's 在我们的应用程序中记录数据库连接的创建和销毁ConnectionCustomizer。在其中,我有一些看起来像这样的代码:

我遇到了僵局。我发现 c3p0 在其库中至少有几个使用同步方法的对象,并且似乎没有指定它们预期的锁定顺序。当我记录连接时,我会锁定C3P0Registry并最终PoolBackedDataSource(只需创建数据源列表即可访问导致锁定的哈希码)。

关闭连接提供程序(调用C3P0ConnectionProvider.close())会导致以相反的顺序调用锁。但是,当子数据源被关闭时,我的日志记录被触发了。结果是死锁。

似乎我对 c3p0 库进行的两个调用都是有效的预期调用:

  • C3P0ConnectionProvider.close()
  • C3P0Registry.getPooledDataSources()

似乎(除非在文档中明确说明)管理它自己的锁定策略应该是库的责任。(我说这不是为了责怪任何人.. 只是为了确认我对最佳实践的理解)

我应该如何处理这个问题?由于 c3p0 使用同步方法而不是更现代的机制,因此我无法真正测试锁。

从我的DataSource关闭代码中,我可以C3P0Registry在关闭DataSource. 我会猜测正确的锁定顺序,我不知道我是否觉得舒服。

我不认为我可以反转日志调用的锁定顺序。我需要C3P0Registry来获取 的列表DataSources,所以如果DataSources没有先锁定C3P0Registry来获取对它们的引用,我就无法锁定 。

当然,另一种解决方案是在 c3p0 之上提供另一个更高级别的锁。在连接池的情况下,这似乎违背了这一点。

现在,我正在回滚我的日志记录。谢谢你的帮助。

0 投票
5 回答
56913 浏览

sql-server - 选择/更新或多选之间的 SQL Server 死锁

所有关于 SQL Server 死锁的文档都讨论了操作 1 锁定资源 A 然后尝试访问资源 B 并且操作 2 锁定资源 B 并尝试访问资源 A 的场景。

然而,在我们的一些繁忙的应用程序中,我经常看到选择和更新之间甚至是多个选择之间的死锁。我发现死锁跟踪输出的一些更好的点非常难以理解,但我真的很想了解什么会导致两个单一操作之间的死锁。当然,如果选择具有读锁,则更新应该在获得排他锁之前等待,反之亦然?

这发生在 SQL Server 2005 上,我认为这并不重要。

0 投票
6 回答
9929 浏览

oracle - 当 Hibernate 应用程序加载数据以供只读使用时 Oracle 死锁

我们遇到了 Oracle 死锁(org.hibernate.util.JDBCExceptionReporter - ORA-00060:在等待资源时检测到死锁)错误。有人建议问题出在使用 Hibernate 执行只读操作的进程,而另一个进程正在对同一行执行更新。

有问题的只读进程是使用 Hibernate 和 Spring 配置的。我们没有明确定义服务的事务。虽然这可能并不理想 - 我不明白为什么 Hibernate 会在没有执行保存/更新操作时尝试在一行上获得排他锁 - 只有一个获取/加载。

所以我的问题是:Hibernate 在没有定义明确的事务管理时是否尝试在行上获得读/写锁,即使只执行对象的“加载”。不执行保存/更新。

是否有可能围绕正在加载数据的服务定义一个事务,然后在 transactionAttributes 上明确说 READONLY 会导致 Hibernate 忽略已经存在的行锁并仅出于只读目的加载数据?

以下是一些代码示例:

为了加载记录,我们使用 HibernateDaoTemplate

调用此方法的服务的 Spring 配置为:

实际死锁发生在通过调用加载 PurchaseOrder 加载的 PurchaseOrderItem 记录之一上。

如果正在加载的记录被另一个进程锁定,这会导致死锁吗?如果是这样 - 添加一个如下所示的事务包装器会解决问题吗?

更新:数据库团队在服务器上看到了似乎表明我们的“只读”进程实际上正在自动写入数据库的跟踪消息。在我们从数据库中读取的确切列上执行了记录的“更新”命令。似乎 Hibernate 会自动将这些记录写回数据库(即使我们没有要求它这样做)。这可能可以解释为什么会出现死锁。

这可能是因为 Session FLUSH 或类似的原因吗?看起来更像是解决方案可能是使用带有 readOnly 的事务包装器......

0 投票
4 回答
2985 浏览

c# - 监控代码触发事件的软件

我在我认为与鼠标单击事件有关的代码块中遇到问题,但我似乎无法在我的代码中捕获确切的事件。我已经使用 C# 调试器单步执行我的代码,并且在我的一个事件结束后,代码只是锁定了。

我的帖子的目的是询问是否有任何软件可以监视我的过程并让我知道在我按下 F11 键并且代码冻结后触发的事件。我试过 SysInternals'procmon.exe但这并没有告诉我哪些事件正在触发。

0 投票
3 回答
2506 浏览

multithreading - ThreadPool、QueueUserWorkItem 和关机时的死锁

我刚刚实现了一个如此处所述的线程池

Allen Bauer 谈线程池

非常简单的实现,工作正常,但我的应用程序不再关闭。似乎有两个工作线程(和另一个线程,我猜是排队线程)卡在函数中

我记得在 QueueUserWorkItem(线程池实现中使用的 WinAPI 函数)的帮助条目中读过一些关于 IO 完成的内容,但我无法正确理解。我将 WT_EXECUTELONGFUNCTION 用于我的工作线程,因为执行可能需要一段时间,我希望创建一个新的工作线程而不是等待现有的工作线程完成。分配给工作线程的一些任务执行一些 I/O 工作。我尝试使用 WT_EXECUTEINIOTHREAD 但它似乎没有帮助。

我应该提到,主线程等待进入关键部分,调用堆栈为

有什么想法我在这里做错了吗?提前感谢您的帮助。

0 投票
3 回答
30883 浏览

sql-server-2008 - Sql Server 2008 中的死锁故障排除

我的网站似乎无法处理大量访问者,我相信这是因为服务器太简单了。

2 小时前,我的网站获得了很多点击,我注意到发生了 3 个死锁错误,错误是:

System.Data.SqlClient.SqlException :事务(进程 ID 58)在锁定资源上与另一个进程死锁,并已被选为死锁受害者。重新运行事务。

我不确定为什么会发生这种情况......查看堆栈跟踪,我可以看到这是通过选择查询发生的。

任何人都知道这个错误的原因可能是什么?

服务器运行的是 Windows 2008 和 Sql Server 2008。

0 投票
6 回答
18113 浏览

database - 数据库死锁

我们有数据库死锁的一个典型原因是当两个事务以不同的顺序插入和更新表时。

例如,事务 A 在表 A 中插入,然后在表 B 中插入。

事务 B 在表 B 中插入,然后是 A。

这种情况总是存在数据库死锁的风险(假设您没有使用可序列化的隔离级别)。

我的问题是:

  1. 您在设计中遵循什么样的模式来确保所有事务都以相同的顺序插入和更新。我正在阅读的一本书 - 建议您可以按表格名称对语句进行排序。您是否做过类似或不同的事情 - 这会强制所有插入和更新都以相同的顺序进行?

  2. 删除记录怎么办?删除需要从子表开始,更新和插入需要从父表开始。你如何确保这不会陷入僵局?

0 投票
4 回答
4382 浏览

java - Java 中同步是如何工作的

首先,这是一个示例

我不明白阻塞是如何发生的。主函数启动两个线程,每个线程都开始自己的弓。

“同步”到底是什么块?为同一个对象运行相同的函数(正如我最初认为的那样)?同一类的所有对象都具有相同的功能?同一个对象的所有同步函数?同一类的所有对象的所有同步函数?

帮帮我。

0 投票
4 回答
17463 浏览

sql - 获得下一个没有“身份”的身份证号码的最佳方法

我必须在遗留数据库的表中插入一些记录,并且由于其他古老系统使用它,因此更改表不是解决方案。

问题是目标表有一个 int 主键但没有标识规范。所以我必须找到下一个可用的 ID 并使用它:

但是,当我这样做时,我想防止其他应用程序插入表中,这样我们就不会遇到任何问题。我试过这个:

在 SQL Management Studio 的两个不同窗口中,一个事务总是作为死锁牺牲品被杀死。

我也先尝试SET TRANSACTION ISOLATION LEVEL SERIALIZABLE了相同的结果...

关于如何确保我获得下一个 id 并使用它而不冒其他人(或我!)被冲洗掉的风险,有什么好的建议吗?

很抱歉之前没有提到这一点,但这是一个 SQL 2000 服务器,所以我不能使用 FOR UPDATE 和 OUTPUT 之类的东西

更新:这是对我有用的解决方案:

WAITFOR 是为了让我可以有多个连接并多次启动查询以引发并发。

感谢 Quassnoi 的回答以及所有其他做出贡献的人!惊人的!

0 投票
5 回答
1886 浏览

c++ - MoveWindow 死锁?

我在线程 A 上有一个窗口,它在某些时候(由于在其 wndproc 上接收到消息)触发线程 B 上的操作,然后等待操作完成(使用某种同步机制)。线程 B 然后调用MoveWindow(), 以在线程 A 的窗口(例如标准文本框)内移动子窗口。此时程序由于某种原因进入死锁状态。如果MoveWindow()从线程 A 调用,一切正常。任何想法为什么?