问题标签 [database-deadlocks]

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 投票
3 回答
7188 浏览

nhibernate - 处理 NHibernate 事务错误

我们的应用程序(使用 NHibernate 和 ASP.NET MVC)在进行压力测试时会引发很多 NHibernate 事务错误。主要类型有:

  1. 事务未连接,或已断开连接
  2. 行被另一个事务更新或删除(或未保存值映射不正确)
  3. 事务(进程 ID 177)与另一个进程在锁资源上死锁,并已被选为死锁牺牲品。重新运行事务。

有人可以帮助我确定异常 1 的原因吗?我知道我必须处理代码中的其他异常。有人可以向我指出可以帮助我以有效方式处理这些错误的资源吗?

问:我们如何管理会话和事务?

A. 我们正在使用 Autofac。对于每个服务器请求,我们创建一个新的请求容器,该容器在容器生命周期范围内具有会话。在激活会话时,我们开始事务。当请求完成时,我们提交事务。在某些情况下,交易可能是巨大的。为简化起见,每个服务器请求都包含在事务中。

0 投票
1 回答
222 浏览

mysql - 在我的场景中使用 oracle 和 innodb 最小化表死锁

我有 35 个函数在事务中更新 1 到 3 个表。但是,它们不仅执行更新,还执行查询。

  • 表 1 只更新行操作和一些查询。
  • 表 2 对现有行进行查询和行级别更新,有时还会删除和添加行。表 2 可能在行删除和/或插入,和/或更新之前和之后在事务中具有查询。
  • 表 3 根据上述表 2 操作的结果进行行更新。

我的第一个动作是确保表 3 的更新都在最后完成。

表 1 独立于其他 2 个表,可能是第一个或最后一个。所以表 2 必须在表 3 更改之前。

我首先担心的是,对于表 2 操作,我先进行查询,然后进行更新,然后再进行更多查询,有时还会进行更多更新。我是否必须重组我的代码才能不这样做。

我的第二个担心是表 3 是带有 servlet 线程的表必须很快。表 3 本身用于简单查询。但似乎行级锁会停止这些查询。

如果必须,我可以从一个线程将上述表集维护代码放在单个集群范围的进程中。更新速度无关紧要。只是对表 3 的查询很快。而且从来没有任何僵局。

我不知道 Oracle 和 Innodb 之间的区别,所以我有疑问。(我计划稍后升级到 Oracle。)

基本上,我正在寻找有关注意事项的指示。当然,我可以在每个更新程序函数的开头强制对表 2 和表 3 进行全表锁定,但是这样我的 Table3 servlet 查询线程就会受到影响。所以这似乎不是一个解决方案。

此外,我担心仅相对于表 2 本身,某些函数会执行查询、基于查询的更新、基于更新的新查询,然后是更多更新,包括将结果流向表 3 的更新。这似乎真的很讨厌。

建议?安迪

可能会同时更新 2 个表的相同行,并且我已经注意以相同的顺序使用更新来命中表。其中一个表有 2 个索引,并且似乎需要一个表锁来更新索引?一些函数查询表 1,更新表 1,然后可选地查询表 2,然后更新表 2,重复循环。该表将所有父子关系保存在我所有内容的树中,因此它是跨所有用户的大量更新。

0 投票
3 回答
1088 浏览

mysql - Mediawiki 数据库错误 1205

我刚刚在http://konton.us/wiki上安装了一个新的 mediawiki

我很高兴在我的 wiki 上玩耍,用信息填满这个地方,突然间,当我创建一篇名为 Gameplay_Mechanics 的文章时,一切都死了。

http://konton.us/wiki/Gameplay_Mechanics

我收到了这个错误:

发生数据库查询语法错误。这可能表明软件中存在错误。最后一次尝试的数据库查询是:(隐藏的 SQL 查询)来自函数“”。数据库返回错误“1205:超过锁定等待超时;尝试重新启动事务 (internal-db.s76387.gridserver.com)”。

我能够通过“清空”文章然后保存它来修复它 - 只是再次重新填充它但是......它在不到 1 天后发生......再次,所以我有点想知道什么是实际根这个荒谬的错误的原因。

感谢所有帮助

0 投票
1 回答
1889 浏览

sql-server - 实体框架死锁问题

我对 .NET 4 的新实体框架有一个奇怪的问题

我有一个 SQL Server 2005 (EXPRESS) 数据库,我的服务使用实体框架将数据写入两个表。假设表是 TableA 和 TableB。TableB 具有 TableA 的外键。在我的程序中有几个并行写入数据的线程。每个线程都有自己的 ObjectContext。该程序创建 TableA 对象并将其放入对象上下文中。然后创建 TableB 的对象并将其放入对象上下文。这对几个 TableA 项目重复。

最后,当调用 ObjectContext.Save 方法时,我在日志中看到一个死锁错误:

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

似乎它以某种方式取决于数据库选项,因为它仅在特定数据库上重现。一个新的数据库没有重现该问题。Entity Framework 执行批量插入时,哪些数据库\表设置会影响死锁?或者可能是其他地方的问题?

0 投票
3 回答
160 浏览

sql - 如何从表中选择未引用的行并将其锁定?

我有一个小木屋表,其中一个小木屋被一个帐户引用......

小木屋一开始没有参考。当用户购买小屋时,代码需要找到未引用的小屋并将其分配给新创建的帐户。我认为返回的小屋需要在其上具有 UPDLOCK,直到提交将引用它的帐户以阻止并发购物者被分配相同的小屋。

如何编写获取小屋的 SELECT?我在想这样的事情..

我认为问题在于,如果此查询同时运行,则一个查询可能会锁定一个表的一半,而另一个查询可能会锁定另一半,并且会确保死锁。有没有解决的办法?例如,是否可以将选定的小屋行锁定在相同的顺序中?

干杯,伊恩。

0 投票
1 回答
2164 浏览

sql-server - 什么是金融运营中的锁定、死锁问题?

子查询SQL - 什么时候应该使用“with (nolock)” </a>

在当地的一家金融机构中,他们的程序员指责我表达了我的观点,即(他们的程序员痴迷于)(b)锁定他们的 MS SQL Server 2005 数据库中的问题对我来说没有多大意义。

如果财务操作从未更新、删除甚至不正确的操作(“交易”的一部分?)通过向数据库中插入(添加)新的更正记录来更正,那么可能出现的锁定、阻塞、死锁问题是什么?
这在英语中的术语是什么?在其他语言中,它被称为 storno、stornoed (?) 操作/记录。

因此,据我了解,“交易”实际上永远不会回滚,也永远不会有不正确/不存在的记录,只有未实现的记录。

更新:
我用谷歌搜索了 storno,找不到任何用英文定义或在英文文本中使用的结果。
我仅在意大利语中找到了 storno(拉丁字母)的定义。
但是会计是在意大利发明的,许多意大利会计术语在其他语言中使用,例如,在俄罗斯会计(银行)中。
我还以为这是国际公认的财务运营会计惯例,不是吗?

更新 2:
S.Lott 给了我链接到
在 ERP 应用程序中交易被撤销的方式很重要!说 storn 是逆转交易。

好吧,这是不正确的。Storno 不仅是交易,它是纠正错误操作的任何操作(交易的一部分),尽管 2 个操作组合起来可能看起来是逆向交易(由 2 个操作组成 - 对目标和源帐户进行贷记和借记)。

那么,storno 是不是全球通用的财务会计实践?

无论如何,我想避免讨论会计细节/技术/术语,并将问题限制在从不删除或更新记录的上下文中。

在这种情况下,锁定、阻塞、死锁、性能可能会出现哪些问题?

0 投票
1 回答
23823 浏览

db2 - 如何在 DB2 上的多个表上使用 WHERE 条件执行安全的“SELECT FOR UPDATE”?

问题

在 DB2(9.5 版)上,SQL 语句

给我错误消息SQLSTATE=42829(不允许使用 FOR UPDATE 子句,因为无法修改游标指定的表)。

附加信息

我需要指定WITH RR,因为我在隔离级别上运行READ_COMMITTED,但是当有另一个进程运行相同的查询时,我需要阻止我的查询。

到目前为止的解决方案...

如果我改为这样查询:

一切正常。

新问题

但是现在当多个进程同时执行此查询时,我偶尔会遇到死锁异常。

问题

有没有办法在FOR UPDATE不引入可能发生死锁的地方的情况下制定查询?

0 投票
2 回答
2002 浏览

nservicebus - 订阅自己发布的消息的 NServiceBus 主机

使用的 NServiceBus 版本:2.0.0.1145

问题:

是否可以配置 NServiceBus 主机,使其消费(订阅)他自己发布的消息?

回答:

这似乎是可能的,但在下面的配置中,它在尝试将订阅插入订阅存储时给了我一个事务死锁异常。当您使用 DbSubscriptionStorage 和超过 1 个“NumberOfWorkerThreads”时会发生这种情况。

错误:

Could not execute command:
INSERT INTO Subscription (SubscriberEndpoint, MessageType) VALUES (@p0, @p1)
System.Data.SqlClinet.SqlException:
Transaction was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

之后,NServiceBus 尝试断开连接但失败,因为事务仍在进行中并引发 UnhandledException。

如何重现:

这是我的 App.Config:

我的总线配置:

这是我的订阅和传奇数据库的 dbProperties:

只要我不将 NumberOfWorkerThreads 增加到 1 以上,一切都可以正常工作。高于此的所有内容都会引发上述错误。

我希望我没有忘记任何事情。提前感谢您的帮助。

0 投票
2 回答
1656 浏览

asp.net - 在表中插入行时 SQL Server 死锁

sql server 死锁这个话题已经讨论过很多次了,但是我不确定即使是在一个表上同时插入两个操作也会导致死锁。

场景:在测试我们的应用程序(SQL Server 2005 作为后端,ASP.net 3.5)时,我们同时将记录插入到表中(简化概述),这导致超过 70% 的用户出现死锁。我无法理解插入是如何陷入死锁的,因为这不是多个资源的情况。经过详细分析(由两个用户重现错误)后,我发现两个进程都在表的主键索引上持有 RangeS-S 锁,并试图将其转换为 RangeI-N 锁,这导致了死锁和一个事务被杀死。

问题:我们能否避免或减少这种死锁,因为这不是资源访问顺序的改变?我们不能'我们强制事务最初获得排他锁以阻止其他进程并避免死锁吗?可能产生什么(不利)影响?也有人可以解释更多关于 RangeI-N 锁的信息。

隔离级别为“可序列化”。

任何建议都会有所帮助。

谢谢,高拉夫

0 投票
2 回答
159 浏览

c# - 需要死锁帮助

我有一个特殊的情况。我的表经常被我们代码的不同部分和数千个客户端访问,因此我们在对表进行简单更新和插入时使用了事务。问题是我们不断收到死锁错误。任何人都知道如何缓解这个问题?