gpt4 book ai didi

MySQL InnoDB 锁问题

转载 作者:可可西里 更新时间:2023-11-01 07:13:01 24 4
gpt4 key购买 nike

我有一个关于 MySQL InnoDB 的问题。例如:我创建了下表:

   mysql>CREATE TABLE IF NOT EXISTS `SeqNum`
(
`id` varchar(10) NOT NULL,
`seq_num` BIGINT(30) default 0,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)

mysql>INSERT IGNORE INTO `SeqNum` VALUES('current',0);
Query OK, 1 rows affected (0.00 sec)

现在,我有两个 mysql 连接到同一个数据库,我将它们命名为线程 A 和 B。在线程 A 中,我有以下 SQL 语句:

    mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select `seq_num` from SeqNum where `id`='current' FOR UPDATE;
+---------+
| seq_num |
+---------+
| 0 |
+---------+
1 row in set (0.01 sec)

然后,我将线程 A 保持原样。

在线程 B 中,我想做同样的查询:

   mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql>SELECT `current_seq_num` FROM SeqNum WHERE `id` = 'current' FOR UPDATE;

线程B会在lock waiting time out后抛出MySQL 1205 Error: Lock wait timeout exceeded;尝试重新启动事务。

这是有道理的,因为线程 A 在该行上放置了一个 'X' 锁,因此线程 B 在线程 A 释放锁之前无法获得 'X' 锁。

现在,我的问题是:从线程 B 的角度来看,当 MySQL 向我返回错误 1205 时,我如何知道哪个线程/连接阻止了我的请求(以获得表 'SeqNum' 的 'UPDATE' 权限)?如果线程 A 在获得 X 锁后什么都不做,而我在线程 B 中运行“show processlist”,我所拥有的只是:几个状态为“ sleep ”的线程(我假设有两个以上的线程连接到数据库),我无法确定哪个线程阻止了我的请求?

希望我能清楚地解释这个问题。谢谢!

最佳答案

InnoDB 插件将为您提供锁定查询和锁定查询的清晰画面。

例如

SELECT r.trx_id waiting_trx_id,  r.trx_mysql_thread_id waiting_thread,
r.trx_query waiting_query,
b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread,
b.trx_query blocking_query
FROM information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;

会给你一个锁定和阻止交易。只有你必须安装 innodb 插件。

关于MySQL InnoDB 锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com