MySQL 死锁日志详解

MySql死锁怎么排查 排查死锁时,通过日志和工具分析根因是关键;预防死锁需要合理设计事务和 SQL;解决死锁则可以通过重试、调整操作顺序、分离事务和优化锁的范围等方式。根据具体场景选择合适的手段,才能有效避免和解决死锁问题。 阅读详情

作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。

目录 [TOC]

正文

1. 准备工作

创建测试表:

CREATE TABLE `t1` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `i1` int DEFAULT '0',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_i1` (`i1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

插入测试数据:

INSERT INTO `t1` (`id`, `i1`) VALUES
(10, 101), (20, 201), (30, 301), (40, 401);

修改两个系统变量:

-- 每次出现死锁,都写入日志到 MySQL 错误日志文件
SET GLOBAL innodb_print_all_deadlocks = ON;

-- 写入死锁辅助信息
SET GLOBAL log_error_verbosity = 3;

2. 死锁日志

创建 2 个连接,按以下顺序执行示例 SQL:

-- 连接 1(事务 1)
BEGIN;
SELECT id FROM t1 WHERE id = 10 FOR UPDATE;

-- 连接 2(事务 2)
BEGIN;
SELECT id FROM t1 WHERE id = 20 FOR UPDATE;

-- 连接 1(事务 1)
SELECT i1 FROM t1 WHERE id = 20 FOR UPDATE;

-- 连接 2(事务 2)
SELECT * FROM t1 WHERE id = 10 FOR UPDATE;

示例 SQL 会导致死锁,MySQL 错误日志中会记录以下死锁日志:

2024-08-04T07:51:55.786277Z 0 [Note] [MY-012468] [InnoDB] Transactions deadlock detected, dumping detailed information.
2024-08-04T07:51:55.786346Z 0 [Note] [MY-012469] [InnoDB]  *** (1) TRANSACTION:
TRANSACTION 246047, ACTIVE 7 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1192, 2 row lock(s)
MySQL thread id 8, OS thread handle 123145473822720, query id 136 localhost 127.0.0.1 root statistics
SELECT i1 FROM t1 WHERE id = 20 FOR UPDATE
2024-08-04T07:51:55.786433Z 0 [Note] [MY-012469] [InnoDB]  *** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 46 n bits 72 index PRIMARY of table `test`.`t1` trx id 246047 lock_mode X locks rec but not gap
Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 0000000a; asc     ;;
 1: len 6; hex 00000003bf87; asc       ;;
 2: len 7; hex 81000001890110; asc        ;;
 3: len 4; hex 80000065; asc    e;;

2024-08-04T07:51:55.786800Z 0 [Note] [MY-012469] [InnoDB]  *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 46 n bits 72 index PRIMARY of table `test`.`t1` trx id 246047 lock_mode X locks rec but not gap waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 00000014; asc     ;;
 1: len 6; hex 00000003bf87; asc       ;;
 2: len 7; hex 8100000189011d; asc        ;;
 3: len 4; hex 800000c9; asc     ;;

2024-08-04T07:51:55.787156Z 0 [Note] [MY-012469] [InnoDB]  *** (2) TRANSACTION:
TRANSACTION 246048, ACTIVE 5 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1192, 2 row lock(s)
MySQL thread id 11, OS thread handle 123145474887680, query id 137 localhost 127.0.0.1 root statistics
SELECT * FROM t1 WHERE id = 10 FOR UPDATE
2024-08-04T07:51:55.787237Z 0 [Note] [MY-012469] [InnoDB]  *** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 46 n bits 72 index PRIMARY of table `test`.`t1` trx id 246048 lock_mode X locks rec but not gap
Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 00000014; asc     ;;
 1: len 6; hex 00000003bf87; asc       ;;
 2: len 7; hex 8100000189011d; asc        ;;
 3: len 4; hex 800000c9; asc     ;;

2024-08-04T07:51:55.787586Z 0 [Note] [MY-012469] [InnoDB]  *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 46 n bits 72 index PRIMARY of table `test`.`t1` trx id 246048 lock_mode X locks rec but not gap waiting
Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 0000000a; asc     ;;
 1: len 6; hex 00000003bf87; asc       ;;
 2: len 7; hex 81000001890110; asc        ;;
 3: len 4; hex 80000065; asc    e;;

2024-08-04T07:51:55.787944Z 0 [Note] [MY-012469] [InnoDB] *** WE ROLL BACK TRANSACTION (2)

3. 详细分析

3.1 辅助信息

2024-08-04T07:51:55.786277Z 0 [Note] [MY-012468] [InnoDB] \
  Transactions deadlock detected, dumping detailed information.

2024-08-04T07:51:55.786346Z 0 [Note] [MY-012469] [InnoDB] \
  *** (1) TRANSACTION:
  ...
2024-08-04T07:51:55.786433Z 0 [Note] [MY-012469] [InnoDB] \
  *** (1) HOLDS THE LOCK(S):
  ...
2024-08-04T07:51:55.786800Z 0 [Note] [MY-012469] [InnoDB] \
  *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
2024-08-04T07:51:55.787156Z 0 [Note] [MY-012469] [InnoDB] \
  ...
  *** (2) TRANSACTION:
2024-08-04T07:51:55.787237Z 0 [Note] [MY-012469] [InnoDB] \
  *** (2) HOLDS THE LOCK(S):
  ...
2024-08-04T07:51:55.787586Z 0 [Note] [MY-012469] [InnoDB] \
  *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
  ...
2024-08-04T07:51:55.787944Z 0 [Note] [MY-012469] [InnoDB] \
  *** WE ROLL BACK TRANSACTION (2)

以上是从死锁日志中择(zhái)出来的辅助信息。只有系统变量 log_error_verbosity 的值为 3,死锁日志中才会包含这些信息。

辅助信息告诉我们紧随其后的日志是什么类型的信息。例如:(1) TRANSACTION 告诉我们紧随其后的是事务信息。

我们先来看看每条辅助日志的前 5 项表示什么。以第 1 条日志为例,前 5 项如下:

/* 第 1 项 */ 2024-08-04T07:51:55.786277Z
/* 第 2 项 */ 0
/* 第 3 项 */ [Note]
/* 第 4 项 */ [MY-012468]
/* 第 5 项 */ [InnoDB]

第 1 项,产生这条日志的时间,精确到毫秒。

第 2 项,线程 ID。因为 InnoDB 调用 ib::info() 方法把辅助信息写入 MySQL 错误日志文件,ib::info() 没有设置正确的线程 ID,所以这一项总是为 0。

第 3 项,日志级别。因为辅助信息都是 information_level 级别,所以这一项总是 Note。

第 4 项,前缀 MY- 加错误码。代码里是这样写辅助信息中第 1 条日志的:

ib::info(ER_IB_MSG_643)
  << "Transactions deadlock detected, dumping"
  << " detailed information.";

ER_IB_MSG_643 的定义如下:

#define ER_IB_MSG_643 12468

前缀 MY- 加上错误码 12468,就变成了 MY-012468。

第 5 项,子系统名称。InnoDB 产生的日志,子系统名称当然就是 InnoDB 了。

介绍完每条日志的前 5 项,我们再来看看为死锁环中每个事务生成的事务信息、持有的行锁信息、等待中的行锁信息。

/* 第 1 部分 */
*** (N) TRANSACTION:
/* 第 2 部分 */
*** (N) HOLDS THE LOCK(S):
/* 第 3 部分 */
*** (N) WAITING FOR THIS LOCK TO BE GRANTED:

因为死锁环中每个事务都会有这三部分信息,所以我把括号里的数字替换成 N 了。

第 1 部分,事务本身的信息、加锁的概要信息。

第 2 部分,事务持有的行锁信息、加锁记录信息。

死锁环中,事务(X)持有某条记录(R1)的行锁,阻塞了另一个事务获得这条记录的行锁。

如果事务 X 还持有 R1 所在数据页中其它记录的行锁,事务 X 的第 2 部分会包含 R1 和这些加锁记录的信息。

所以,第 2 部分可能会包含一条或多条记录的信息。

第 3 部分,事务正在等待获得的行锁信息、加锁记录信息。

这部分包含处于等待状态的行锁信息,以及一条加锁记录的信息。

因为处于等待状态的行锁结构,不能共用,所以只会包含一条加锁记录。

介绍完死锁环中每个事务的三部分信息,接下来的辅助信息很重要,就是哪个事务被选择成为死锁受害事务了。

2024-08-04T07:51:55.787944Z 0 [Note] [MY-012469] [InnoDB] \
  *** WE ROLL BACK TRANSACTION (2)

从以上辅助信息可以看到,事务 2 被选择成为死锁受害事务了。

3.2 事务信息

TRANSACTION 246047, ACTIVE 7 sec \
  starting index read

TRANSACTION 后面的数字,表示事务 ID,来自事务对象的 id 属性。

ACTIVE 表示事务处于活跃状态,来自事务对象的 state 属性。

sec 前面的数字,表示事务活跃的时间。用产生这条日志的时间,减去事务对象 start_time 属性中保存的事务开始时间得到。

starting index read 表示事务正在准备读取索引记录,来自事务对象的 op_info 属性。如果事务正在做其它事情,这里就会变为其它内容了。

mysql tables in use 1, locked 1

mysql tables in use 后面的数字,表示事务正在执行的 SQL 语句会操作几个表。

locked 后面的数字,表示事务正在执行的 SQL 语句会对几个表加表锁。对于 select、insert、update、delete 语句,这里的表锁通常都是指的意向共享锁或者意向排他锁。

LOCK WAIT 3 lock struct(s), \
  heap size 1192, 2 row lock(s)

LOCK WAIT 表示事务加锁处于等待状态,等待获得表锁或者行锁,都会写入这一项。

lock struct(s) 前面的数字,表示事务使用了几个锁结构(包含表锁结构和行锁结构),来自事务对象 trx_locks 链表中的锁结构数量。

heap size 后面的数字,表示事务对象用于创建新的表锁结构和行锁结构的堆内存大小,1192 是调试环境 Debug 版本的初始大小,单位是字节。

如果是线上环境 Release 版本的 MySQL,初始大小是 1156 字节。

如果这块内存不够用了,InnoDB 会扩大这块内存,那样的话,我们看到的 heap size 就会大于 1192 或者 1156。

row lock(s) 前面的数字,表示事务加行锁的记录数量(包含已经获得锁、等待获得锁的记录)。

MySQL thread id 8, \
  OS thread handle 123145473822720, \
  query id 136 \
  localhost 127.0.0.1 \
  root \
  statistics \
  SELECT i1 FROM t1 WHERE id = 20 FOR UPDATE

以上日志是执行事务的线程信息。

MySQL thread id 后面的数字,是 MySQL 分配给线程的 ID,用于 MySQL 内部标识一个线程。

OS thread handle 后面的数字,是操作系统分配的线程 ID。

query id 后面的数字,是 MySQL 当前执行的 SQL 语句 ID。

这个 ID 从 1 开始,每执行一条 SQL 语句就加 1。换句话说,它表示 MySQL 正在执行本次启动以来的第几条 SQL 语句。

localhost 127.0.0.1 是客户端的主机名和 IP 地址。如果没有获取到主机名,localhost 的位置就不会显示了。

statistics 是线程当前正在做的事情,来自 server 层线程对象的 m_proc_info 属性,和事务对象的 op_info 属性值不同。

最后是线程当前正在执行的 SQL 语句,也就是导致死锁的 SQL 语句。

3.3 行锁信息

RECORD LOCKS \
  space id 0 \
  page no 46 \
  n bits 72 \
  index PRIMARY of table `test`.`t1` \
  trx id 246047 \
  lock_mode X \
  locks rec but not gap

RECORD LOCKS 表示接下来的是行锁信息。

space id 后面的数字,表示加锁记录所属表的表空间 ID。示例 SQL 中 t1 表位于系统表空间,所以表空间 ID 为 0。

page no 后面的数字,表示加锁记录所属数据页的页号。

n bits 后面的数字,表示加锁记录对应行锁结构的 bitmap 内存区域有多少位,可以标识多少条记录是否加锁。这个数字除以 8 就是 bitmap 内存区域占用的字节数。

index PRIMARY of table `test`.`t1` 表示事务对哪个数据库中哪个表的主键索引记录加锁。

如果是对二级索引记录加锁,PRIMARY 处就是二级索引名了。

trx id 后面的数字,表示加锁的事务 ID。

lock_mode 表示行锁的模式,共享锁为 X,排他锁为 S。

locks rec but not gap 表示行锁的精确模式为普通记录锁。

如果是间隙锁,这里会改为 locks gap before rec。

如果是插入意向锁,这里会改为 insert intention。

如果是 Next-Key 锁,这个位置就不会显示任何内容了。

如果事务对这条记录加行锁,处于锁等待状态,在行锁的精确模式之后还会显示 waiting。

Record lock, heap no 2 \
  PHYSICAL RECORD: n_fields 4; compact format; info bits 0
0: len 4; hex 0000000a; asc     ;;
1: len 6; hex 00000003bf87; asc       ;;
2: len 7; hex 81000001890110; asc        ;;
3: len 4; hex 80000065; asc    e;;

以上日志表示一条加锁记录的信息。

对于已经获得锁的行锁结构,可能会包含一条或多条加锁记录的信息。

对于处于锁等待状态的行锁结构,只有一条加锁记录的信息。

Record lock 表示加锁记录。

heap no 后面的数字,表示加锁记录在其所属数据页中的编号。这个编号跟记录的物理顺序和逻辑顺序都没有关系,只是用来唯一标识数据页中一条记录。

PHYSICAL RECORD 表示接下来的是物理记录信息。

n_fields 后面的数字,表示物理记录的字段数量。

compact format 表示记录的格式是 compact、dynamic、compressed 三者之一。

如果记录的格式是 redundant,compact format 会变为 1-byte offsets format 或者 2-byte offsets format。

info bits 包含两个标志位:记录的删除标志、B+ 树索引非叶子结点中当前层级最小的用户记录标志。这一项的值为 0,说明两个标志位都没有设置。

接下来就是物理记录中各字段的长度和内容了。

示例 SQL 中,t1 表只有 id、i1 两个字段,日志中却记录了 4 个字段,这是因为 InnoDB 记录还包含 DB_TRX_ID(事务 ID)、DB_ROLL_PTR(undo 日志地址)两个额外字段。

DB_TRX_ID、DB_ROLL_PTR 总是位于主键字段之后。对于 t1 表,以上日志对应的字段如下:

-- id
0: len 4; hex 0000000a; asc     ;;
-- DB_TRX_ID
1: len 6; hex 00000003bf87; asc       ;;
-- DB_ROLL_PTR
2: len 7; hex 81000001890110; asc        ;;
-- i1
3: len 4; hex 80000065; asc    e;;

每个字段的内容都以 16 进制显示,如果字段为无符号整数类型(create table 或者 alter table 为字段指定了 unsigned 关键字),字段内容加上前缀 0x,再转换为十进制就可以得到整数值。

说明:DB_TRX_ID、DB_ROLL_PTR 都是无符号整数类型。

以上面日志中 id 字段为例,在 shell 命令行中执行以下命令就可以得到整数值:

## 输出结果为 10
echo $((0x0000000a))

如果字段为有符号整数类型,字段内容加上前缀 0x,并对符号位进行异或操作,再转换为十进制就可以得到整数值。

以上面日志中 i1 字段为例,在 shell 命令行中执行以下命令就可以得到整数值:

## ^ 表示【异或】操作
## 4 是 i1 字段的长度,表示 4 字节
## 符号是是最高位,4 字节的符号位是第 32 位(4 * 8 = 32)
## 1 左移(<<)31 位(32 - 1 = 31)就是符号位
## 输出结果为 101
echo $((0x80000065 ^ (1 << (4 * 8 - 1))))

4. 总结

没有需要总结的内容了,但是,总结 这一小节不能少,因为仪式感还是要有的。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

👥 微信群:请添加小助手加入 ActionOpenSource

🔗 商业支持:https://www.actionsky.com/sqle

死锁日志 一 一 前言 工欲善其事必先利其器,前面分析了很多死锁案例,并没有详细的介绍如何通过死锁日志来诊断死锁的成因。本文将介绍如何读懂死锁日志,尽可能的获取信息来辅助我们解决死锁问题。二 日志分析 2.1 场景 为了更好的学习死锁日志,我们需要提前了解死锁场景 MySQL 5.6 事务隔离级别为RR CREATE TABLE `ty`( `id`int(11)NOTNULL AUTO_INCREMENT, `a`int(11)DEFAULT NULL, ... 阅读详情

相关推荐

MySQL死锁记录(INSERT INTO ... SELECT.... )

一、前言 在线上发布新功能后,追踪了日志记录,发现有死锁的报错记录。因业务复杂,仅简化问题,先将问题简化复原。特在此记录解决分析过程。 先抛出问题,后附解决方案; 事务A 事务B 1、 insert into user_01 (name,age) select name,age user_02 1、update user_02 set name = ‘lisi’ where id = ‘2’ 2、update user_02 set name = ‘lisi’ where id

qq_45872465的博客 3738

MySQL死锁日志

MySQL死锁日志

lizc_lizc的博客 2759

Zemax光机热集成分析:从FEA数据导入到光学性能评估实战

在精密光学系统设计中,环境温度变化和机械应力是导致像质恶化的关键因素,这涉及到光、机、热多物理场的耦合分析。其核心原理在于,通过有限元分析(FEA)软件(如ANSYS)模拟热与力学载荷下的结构变形和温度分布,并将这些物理场数据精准映射到光学设计软件(如Zemax)中,以评估其对调制传递函数(MTF)、点列图等核心光学指标的影响。这项技术的工程价值在于,它使设计从静态的理想模型跃升至动态的工程现实,能够在设计阶段就预测并补偿环境扰动,从而显著提升光学系统在航空航天、车载镜头、高功率激光等严苛工况下的可靠性与稳

weixin_30565327的博客 356

如何解决MySQL死锁(看懂MySQL锁日志)

有时候系统在生产运行着,会突然爆出这个时候每个人都会很紧张,因为死锁会影响DB性能,严重时甚至拖垮整个系统。在实际的环境中,很多服务会共用一个数据库,一旦数据库挂了,基本就是P0事故。那么,死锁发生时,我们如何定位到死锁发生的SQL?

马不腾的博客 5399

Ubuntu22.04下RTX2080显卡驱动、CUDA、cuDNN保姆级避坑安装指南(实测有效)

本文提供Ubuntu22.04下RTX2080显卡驱动、CUDA和cuDNN的详细安装指南,涵盖前期准备、驱动安装、CUDA版本选择、cuDNN配置及常见问题解决。通过实测有效的步骤和优化建议,帮助用户快速搭建稳定的深度学习环境,避免常见陷阱。

weixin_42540248的博客 285

别再到处找了!2024最新银河麒麟V10全版本(飞腾/龙芯/兆芯)官方下载与安装保姆级教程

本文提供2024年银河麒麟V10操作系统全版本(飞腾/龙芯/兆芯)的官方下载与安装保姆级教程,涵盖版本选择、镜像获取、启动盘制作及安装优化等关键步骤,助您高效部署国产操作系统。

weixin_26846533的博客 486

分析一下MySQL 死锁日志

MySQL 死锁日志分析

来北欧写代码 3236

NRF24L01模块的5个常见问题及解决方案:从信号干扰到功耗优化

本文深入探讨NRF24L01无线模块在STM32开发中的5大常见问题及解决方案,包括通信距离优化、数据丢失排查、电源噪声抑制、SPI通信故障处理以及低功耗设计。通过代码示例和电路图分析,提供实用的优化策略,帮助开发者提升无线通信的稳定性和效率。

weixin_28256233的博客 226

如何在MySQL中开启死锁日志及查看日志

如何在MySQL中开启死锁日志及查看日志

一起coding,一起嗨。 1523

【数字图像处理第四版课后习题答案】第2章 数字图像基础(含英文原版)

如图 P2.3 所示,视网膜图像中与点相对应的直径 x 是由类似的三角形得到的。即得出 x = 0.085d。根据第 2.1 节中的讨论,并结合一些自由解释,我们可以将眼窝视为一个方形传感器阵列,拥有大约 337,000 个元素,这相当于一个大约 580×580 个元素的阵列。假设元素间距相等,则在 1.5 毫米长的直线上有 580 个元素和 579 个空间,共计 1,159 个。换句话说,如果一个点的直径 d<1.3×10-6 m,或者 d<15.3×10 m,眼睛就无法检测到这个点。

weixin_56463218的博客 1万+

新手必看!手把手教你如何在飞牛NAS上玩转Docker容器!(飞牛Nas(fnOS)如何创建Docke容器以及Compose部署项目)

新手必看!手把手教你如何在飞牛NAS上玩转Docker容器!(飞牛Nas(fnOS)如何创建Docke容器以及Compose部署项目)

XiaoqiangClub的博客 1万+

MySQL死锁日志分析

MySQL死锁日志分析指南摘要: MySQL死锁日志是诊断锁冲突的核心工具,包含事务ID、SQL语句、锁等待关系等关键信息。获取方式包括配置innodb_print_all_deadlocks参数和实时监控错误日志。日志分析需重点关注循环等待链和锁类型(记录锁/间隙锁),可通过绘制事务关系图直观展示死锁路径。解决方案包括:1)优化事务设计(固定资源访问顺序);2)添加合适索引;3)使用乐观锁替代悲观锁;4)调整隔离级别。建议建立监控机制,通过PMM或Prometheus跟踪死锁指标。完整分析流程包含日志获取

Made In SQL 1264

【项目实战】使用Python - Mediapipe、OpenCV进行手部面部检测(Python源码)

本文介绍了使用MediaPipe和OpenCV库进行实时面部和手部关键点检测的方法。通过MediaPipe的Holistic模型,可以获取468个面部特征点及每只手21个特征点。文章详细说明了环境配置、模型初始化参数设置,并提供了完整的代码实现,包括视频流处理、关键点绘制和FPS计算等功能。这套方案可应用于手语识别、疲劳检测等计算机视觉场景,为开发者提供了一套高效的开箱即用解决方案。

梦想起飞的地方 483

mysql 死锁日志_【MySQL】如何阅读死锁日志

一 前言工欲善其事必先利其器,前面分析了很多死锁案例,并没有详细的介绍如何通过死锁日志来诊断死锁的成因。本文将介绍如何读懂死锁日志,尽可能的获取信息来辅助我们解决死锁问题。二 日志分析2.1 场景为了更好的学习死锁日志,我们需要提前了解死锁场景MySQL 5.6 事务隔离级别为RRCREATE TABLE `ty`(`id`int(11)NOTNULL AUTO_INCREMENT,`a`int(...

weixin_32617915的博客 938

ROCm rocr-libhsakmt分析系列1-2:多GPU跨卡VRAM访问机制分析

本文基于ROCr-Runtime的libhsakmt库源码,深入分析了多GPU系统中跨设备内存访问的实现机制。主要内容包括: 实现流程概述:通过P2P拓扑发现、统一虚拟地址空间、页表映射和硬件转发四个步骤,实现零拷贝的跨GPU内存访问。

图形/计算GPU的驱动与虚拟化技术分享园地 2508

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

MySQL 死锁日志分析方法

作者:京东物流 张凯引言MySQL 死锁是线上经常遇到的现象,但是死锁分析却并不总是件容易的事情,本文介绍 MySQL 死锁日志的分析方法,帮助研发从日志中快速提取有效信息,从而提高死锁原因分析的效率。死锁介绍触发条件死锁的触发条件包括四个:•互斥•占有且等待•不可抢占用•循环等待如下图所示,两个事务加锁顺序不同导致死锁。...

cnzzs的博客 989

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

mysql死锁日志

前言: 在 MySQL 运维过程中,难免会遇到 MySQL 死锁的情况,一旦线上业务日渐复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常。这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,有时候处理起来毫无头绪,一般只能从死锁日志下手。本篇文章我们一起来看下 MySQL 的死锁日志。 1.手动打印死锁日志 当业务发生死锁时,首先是线上错误日志报警发现死锁异常,也会提示一些堆栈信息,然后会反馈到数据库层面进行排查。我们一般会在命令行执行 show engine innodb statu

羽之大公公的博客 3263

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MySQL如何阅读死锁日志

转载地址 http://blog.itpub.net/22664653/viewspace-2145133/ 一 前言 欲善其事必先利其器,前面分析了很多死锁案例,并没有详细的介绍如何通过死锁日志来诊断死锁的成因。本文将介绍如何读懂死锁日志,尽可能的获取信息来辅助我们解决死锁问题。 二 日志分析 2.1 场景 为了更好的学习死锁日志,我们需要提前了解死锁场景 MySQL 5.6 事务隔离级别为RR CREATE TABLE `ty` ( `id` int(11) NOT NULL AUTO_INCREM

张俊杰 的博客 769

MySQL死锁日志的查看和分析

目录 一,关于MySQL的死锁 二,人造一个死锁的场景 三,查看最近一次死锁的日志 四,死锁日志的内容 1,事务1信息 2,事务1持有的锁 3,事务1正在等待的锁 4,事务2信息 5,事务2正在持有的锁 6,事务2正在等待的锁 7,死锁处理结果 五,关于mysql的八种锁 1,行锁(Record Locks) 2,间隙锁(Gap Locks) 3,临键锁(Next-key Locks) 4,共享锁/排他锁(Shared and Exclusive Locks) 5,意向共享

lkforce 3万+

mysql 死锁日志_细说MySQL死锁与日志二三事

最近线上 MySQL 接连发生了几起数据异常,都是在凌晨爆发,由于业务场景属于典型的数据仓库型应用,白天压力较小无法复现。甚至有些异常还比较诡异,最后 root cause 分析颇费周折。那实际业务当中咱们如何能快速的定位线上 MySQL 问题,修复异常呢?下文我会根据两个实际 case,分享下相关的经验与方法。Case1:部分数据更新失败某天渠道同学反馈某报表极个别渠道数据为 0,大部分渠道数据...

weixin_28728495的博客 864

mysql死锁日志阅读

前言 在开发中,我们经常会遇到死锁问题,我们会查看数据库的死锁日志来查看死锁出现的原因,但是死锁日志如果不会阅读的话,可能就导致我们难以进行问题的排查 环境介绍 1、数据库场景 MySQL 5.6 引擎为innodb 事务隔离级别为RR CREATE TABLE `ty` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`

weixin_42272869的博客 1986

mysql死锁日志查看方法

它会输出大量的内部信息,内容分为很多小段,每一段对应 innodb 存储引擎不同部分的信息,其中 LATEST DETECTED DEADLOCK 部分显示的最近一次的死锁信息。从死锁日志中可以看到关联的两个事务相关信息,当一个事务持有了其他事务需要的锁,同时又想获得其他事务持有的锁时,等待关系上就会产生循环,Innodb 不会显示所有持有和等待的锁,但死锁日志也显示了相关的信息来帮你确定,排查死锁发生的索引,这对于你确定能否避免死锁有较大的价值。本篇文章我们一起来看下 MySQL 的死锁日志。

glenshappy的专栏 3861

MySQL打印死锁日志

前言: 在 MySQL 运维过程中,难免会遇到 MySQL 死锁的情况,一旦线上业务日渐复杂,各种业务操作之间往往会产生锁冲突,有些会导致死锁异常。这种死锁异常一般要在特定时间特定数据和特定业务操作才会复现,有时候处理起来毫无头绪,一般只能从死锁日志下手。本篇文章我们一起来看下 MySQL 的死锁日志。 1.手动打印死锁日志 当业务发生死锁时,首先是线上错误日志报警发现死锁异常,也会提示一些堆栈信息,然后会反馈到数据库层面进行排查。我们一般会在命令行执行 show engine innodb status\

MySQL技术 1244

MySQL - 死锁问题定位与解决:手把手教你分析死锁日志

MySQL死锁分析与解决指南 摘要:本文深入解析MySQL死锁问题,通过转账业务场景复现典型死锁案例。首先介绍死锁原理(如事务间循环等待资源)和MySQL的死锁检测机制。详细讲解如何开启死锁日志记录(innodb_print_all_deadlocks),并剖析日志结构组成。通过Java代码模拟两个并发转账线程(U1001→U1002和U1002→U1001)引发的死锁场景,展示UPDATE语句在不同顺序下如何形成资源争用。文章提供完整的表结构、初始化数据和可运行的Java示例代码,帮助读者理解死锁产生的具

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: MySQL 索引合并优化实践
下一篇: 数据迁移工具应具备的新式延迟诊断功能
爱可生开源社区
博客等级 码龄8年 1937粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值