解释一下莫名其妙的死锁

2024-01-26

首先,我不明白我怎么能得到any根本没有死锁,因为我没有使用显式锁定,所以只涉及一个表,每个进程都有一个单独的进程来插入、选择和更新行,一次只插入或更新一行,并且每个进程很少(也许一分钟一次)完全运行。

这是一个电子邮件队列:

CREATE TABLE `emails_queue` (
  `id` varchar(40) NOT NULL,
  `email_address` varchar(128) DEFAULT NULL,
  `body` text,
  `status_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `status` enum('pending','inprocess','sent','discarded','failed') DEFAULT NULL,
  KEY `status` (`status`),
  KEY `status_time` (`status`,`status_time`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

生成过程响应某些用户操作,但大约每 90 秒一次,向表中执行一次插入,将状态设置为“待处理”。

有一个监控过程,每分钟检查“待处理”和“失败”电子邮件的数量是否过多。运行时间不到一秒钟,从来没有给我带来任何麻烦。

每分钟,发送进程都会抓取所有待处理的电子邮件。它一次循环一封电子邮件,将其状态设置为“处理中”,尝试发送它,最后将其状态相应地设置为“已发送”、“已丢弃”(它有理由决定电子邮件不应发送) ),或“失败”(被 SMTP 系统拒绝)。

设置状态的语句不寻常。

UPDATE emails_queue SET status=?, status_time=NOW() WHERE id=? AND status = ?

也就是说,只有当前状态已经是我认为的状态时,我才会更新状态。在此机制之前,我不小心启动了两个发送进程,它们每个进程都会尝试发送相同的电子邮件。现在,如果发生这种情况,一个进程会成功地将电子邮件从“待处理”移动到“处理中”,但第二个进程会更新零行,意识到存在问题,并跳过该电子邮件。

问题是,大约百分之一的情况是更新完全失败!我明白了com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

WTH?

这是发生这种情况的唯一表和唯一查询,并且仅发生在生产中(以最大限度地提高调查它的难度)。

唯一看起来不寻常的两件事是 (1) 更新参与 WHERE 子句的列,以及 (2) (未使用的)自动更新 status_time。

我正在寻找任何建议或诊断技术。


首先,死锁不依赖于显式锁定。 MySQL 的 LOCK TABLE 或使用非默认事务隔离模式不需要产生死锁。如果您从不使用显式事务,您仍然可能会遇到死锁。

死锁很容易发生在单个表上。最常见的是它来自单个热表。

死锁可以even如果您的所有事务只执行单行插入,就会发生这种情况。

如果你有的话,可能会发生僵局

  • 与数据库的多个连接(显然)
  • 任何内部涉及多个锁的操作。

不明显的是,大多数时候,单行插入或更新涉及多个锁。原因是二级索引在插入/更新期间也需要锁定。

SELECT 不会锁定(假设您使用的是默认隔离模式,并且没有使用 FOR UPDATE),因此它们不可能是原因。

SHOW ENGINE INNODB STATUS 是你的朋友。它将为您提供一堆有关死锁的(诚然非常令人困惑的)信息,特别是最近的死锁信息。

  • 您无法完全消除死锁,它们将继续在生产中发生(即使在测试系统上,如果对其施加适当的压力)
  • 目标是极低的死锁数量。如果 1% 的事务出现死锁,那可能就太多了。
  • 如果您完全理解其含义,请考虑将事务的事务隔离级别更改为读提交
  • 确保您的软件正确处理死锁。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释一下莫名其妙的死锁 的相关文章

  • 使用 Hibernate 在 MySQL 中存储字节数组

    我正在尝试保存带有字节数组字段的实体 我在 MySQL 数据库之上使用 Hibernate 和 JPA 这是字段定义 对于嵌入式 H2 数据库来说效果很好 Entity name blob public class Blob Lob Bas
  • MySQL有两个不同的密码?

    我确信它们是不同事物的密码 但我不确定是什么 当在终端连接到 MySQL 时 我输入 usr LOCAL mysql BIN mysql h host u username p然后系统会提示我输入密码 密码是 但是当使用 PHP 连接到 M
  • Java 从 SQL 数组获取 ResultSet 失败

    我试图从数据库中检索电子邮件地址 但没有成功 我的代码如下 Main System out println PortfolioData getEmails 58 So Far Returning null 投资组合数据 public sta
  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • 在 MySQL 数据库中存储图像文件或 URL?哪个更好? [复制]

    这个问题在这里已经有答案了 可能的重复 在数据库中存储图像 是还是否 https stackoverflow com questions 3748 storing images in db yea or nay 数据库中的图像与文件系统中的
  • 如何使PHP中的激活链接过期?

    我有一个 php 脚本 它通过电子邮件向用户发送激活链接 以便他们可以激活他们的帐户 链接是这样的 mysite com activation phpid id 20 如何创建 24 小时后过期的链接 我还没有尝试过任何东西 因为我找不到任
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • Preg_replace() 删除除查询结尾之外的所有内容

    首先 为我糟糕的英语感到抱歉 我有这样的疑问 SELECT t1 SELECT COUNT FROM table a t2 WHERE t1 id t2 id c AND t2 status 1 AS aula FROM table c t
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • 通过货币换算获取每种产品类型的最低价格

    我想选择每种产品类型中最便宜的 包括运费 价格转换为当地货币 最便宜 产品 价格 产品 运费 seller to aud 我的数据库有如下表 PRODUCTS SELLERS id type id seller id price shipp
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • ActiveRecord3死锁重试

    Rails 3 或 ActiveRecord 3 是否有任何插件可以复制旧版本死锁重试 http agilewebdevelopment com plugins deadlock retry插入 或者 该插件仍然适用于 Rails 3 吗
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn

随机推荐

  • Flask 只能看到通过curl 发送的多个参数中的第一个参数

    我正在使用curl 向需要多个查询参数的Flask 路由发出请求 但是 日志仅显示 url 中的第一个参数 Flask 看不到第二个参数 出了什么问题 app route path methods GET def foo print req
  • 从 .NET 3.5 WCF Web 服务 (REST) 返回 JSON 和 XML 格式

    我有一个返回 XML 响应的现有 Web 服务 我想添加一些返回 JSON 的新方法 我是否必须创建一个以 JSON 形式返回的单独 Web 服务 还是可以混合使用 如果我使用 ResponseFormat WebMessageFormat
  • 设置 分钟间隔 时 UIDatePicker 的奇怪行为

    以下代码在 iOS 4 3 下显示奇怪的行为 也许其他版本也是如此 在这个例子中 一个UIDatePicker其日期设置为4 Aug 2011 2 31 PM被展示 这UILabel以下UIDatePicker显示日期以供参考 他们三个UI
  • 重写派生类中的成员字段

    我有下面的代码片段 include
  • 如何将 pygame 应用程序转换为 iOS 应用程序

    我使用 pygame 在 python 中编写了一个非常小的未完成的游戏 有没有一种简单的方法可以将其转换为我可以在 iPhone 上使用和测试的应用程序 而无需在 kivvy 等中重写整个代码 没有简单的方法 不可能转换代码 但对于一款简
  • Spark数据集/数据帧连接NULL倾斜键

    使用 Spark Dataset DataFrame 连接时 我面临长时间运行并因 OOM 作业而失败 这是输入 约 10 个不同大小的数据集 大部分都很大 gt 1 TB 所有左连接到一个基础数据集 一些连接键是null 经过一些分析 我
  • 动态大小 UICollectionView 单元格

    1 我怎样才能实现如图所示UICollectionView 2 我已经尝试过 CGSize collectionView UICollectionView collectionView layout UICollectionViewLayo
  • Magento如何缓存productCollection

    我注意到我的主页需要很长时间才能加载 根据 site24x7 com 事实上超过 6 秒 所以我一直在关闭元素以尝试确定原因是什么 这取决于我制作的 2 个产品集合文件展示新产品和畅销产品 当我从主页中删除这些内容后 页面加载时间不到 0
  • Primefaces 数据表冻结列未对齐

    我们有一个数据表 如图所示 有 3 个冻结列 其余可滚动 冻结的列未对齐 如图所示 如果删除冻结列属性 则表看起来正常 任何解决问题的建议 我过去在冻结数据表方面遇到过类似的问题 并在不同的帖子中使用许多不同的脚本 我发现下面的脚本适用于所
  • 当你克隆 `&str` 时会发生什么?

    当你克隆一个时会发生什么 str 是克隆的吗 str指向与克隆者相同的地方 str或者是什么 这有记录在任何地方吗 克隆一个 str与克隆任何相同 T 它只是复制引用 从字面上看 它只是返回自身 https doc rust lang or
  • .FillRectangle 不绘制任何内容

    我无法弄清楚为什么 FillRectangle 不适合我 此外 由于它没有抛出任何异常 我不知道为什么会这样 所以我在这里需要一些帮助 受影响的代码部分是这样的 try using FileStream fileStream File Op
  • 直接从 JavaScript 访问 GET?

    我想我可以使用 PHP 来访问 GET来自 JavaScript 的变量 但也许它更简单 有没有办法直接用JS实现呢 Look at window location search 它将包含一个像这样的字符串 foo 1 bar 2 要将其转
  • 核心数据使用一次后<故障>

    我搜索了几个小时但没有找到任何东西 我处于有线状态核心数据 获取对象的方法 func fetchAllCoreData gt NSArray let moc DataController managedObjectContext let f
  • 如何在android中的gridview适配器的getView()内膨胀另一个布局?

    I want to create weekly calendar view and inside each grid item each day there are may be several activities Out of this
  • 关闭时控制台关闭过程[重复]

    这个问题在这里已经有答案了 我将一个DLL注入到一个进程中 在该进程的入口点我生成一个新线程并分配一个控制台 我将所有std重定向到控制台 当我关闭控制台窗口时整个进程关闭 有没有办法这样它就不会关闭进程 这是我的代码 入口点 pragma
  • 如何识别用户何时开始和停止在 android 中说话? (Android 中的语音识别)

    我已经进行了大量的研发并使用了大量的资源来解决我的问题 但我未能找到任何适当的解决方案 我已经开发了一个应用程序 现在我想添加基于语音的功能 to it 所需的功能是 1 when USER开始说话 应该录制音频 视频 and 2 当用户停
  • StreamSubscription.cancel 与 StreamController.close 在内存泄漏方面的比较

    是否打电话StreamController close自动取消StreamSubscription并删除所有引用 我认为这是有道理的 但我无法在文档中找到它来确定 我有以下代码 dispose context bloc blocSubscr
  • Netsuite Suitescript可以修改文件柜中的文件吗?

    我有一个很大的产品列表 需要生成它的静态文件 并让该文件可以在我的网站中访问 目前 我生成列表 并将其上传到文件柜 我希望自动化这个过程 我想安排一个 SuiteScript 每晚运行并生成此列表并更新文件柜中的文件 这可以做到吗 than
  • HTTP 直播 MPEG TS 段

    我使用 FFMPEG 和免费分段器 Carson Mcdonald s 来生成我的 ts 片段 然后将其保存到网络服务器并通过播放 m3u8 来使用 Quicktime 进行播放 如果我有段 1 2 3 4 和另一个包含段 1 2 3 4
  • 解释一下莫名其妙的死锁

    首先 我不明白我怎么能得到any根本没有死锁 因为我没有使用显式锁定 所以只涉及一个表 每个进程都有一个单独的进程来插入 选择和更新行 一次只插入或更新一行 并且每个进程很少 也许一分钟一次 完全运行 这是一个电子邮件队列 CREATE T