首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL InnoDB锁定问题

MySQL InnoDB锁定问题
EN

Stack Overflow用户
提问于 2010-10-22 03:49:03
回答 4查看 4.3K关注 0票数 4

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

代码语言:javascript
运行
复制
   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连接到同一个数据库,我将它们命名为Thread A和B。在线程A中,我有以下SQL语句:

代码语言:javascript
运行
复制
    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中,我想执行相同的查询:

代码语言:javascript
运行
复制
   mysql> begin;
   Query OK, 0 rows affected (0.00 sec)

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

线程B将在锁定等待超时后抛出MySQL 1205错误:超过锁定等待超时;请尝试重新启动事务。

这是有意义的,因为threadA在该行上放置了一个'X‘锁,因此线程B在线程A释放锁之前不能获得'X’锁。

现在,我的问题是:从线程B的角度来看,当MySQL向我返回错误1205时,我如何知道哪个线程/连接阻塞了我的请求(以获得表‘SeqNum’的'UPDATE‘权限)?如果threadA在获得X锁之后什么也不做,并且我在线程B中运行'show processlist‘,那么我所拥有的就是:几个处于’睡眠‘状态的线程(我假设有两个以上的线程连接到数据库),我不能识别哪个线程阻塞了我的请求?

希望我已经清楚地解释了这个问题。谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-27 03:13:59

我认为在这个阶段,查询"SHOW ENGINE INNODB STATUS\G“可以解决我的问题。这是来自MySQL手册的信息:http://dev.mysql.com/doc/refman/5.0/en/innodb-monitors.html#innodb-standard-monitor

在线程B中运行此查询,您将在"transaction“部分获得阻止您的请求的线程

票数 2
EN

Stack Overflow用户

发布于 2011-07-18 20:08:35

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

例如

代码语言:javascript
运行
复制
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插件。

票数 7
EN

Stack Overflow用户

发布于 2010-10-28 03:40:52

如果您使用较新的(InnoDB插件)版本,您只能很容易地判断出来。您可以查询information_schema中的一些表:

从information_schema.innodb_locks;中选择* FROM information_schema.innodb_trx;

  • SELECT *

在innodb_trx表中,应该有一个名为' trx_mysql_thread_id‘的列(或者类似的列-在MySQL 5.5中是trx_mysql_thread_id)。这是SHOW PROCESSLIST中的id。

(请注意,innodb_locks的名称有误。它将只填充锁等待,而不是锁)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3991311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档