INSERT查询MySQL中未发生锁定等待超时

时间:2019-07-19 14:41:06

标签: mysql timeout locking mysql-5.7

我正在将Mysql 5.7.18与innodb存储引擎一起使用。 Innodb锁定等待超时为5分钟。 隔离级别READ_COMMITED

在某些情况下(将解释情况),INSERT查询正在等待锁定超过5分钟,并且不会引发锁定等待超时异常。

表设计:

mysql> show create table Users;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                    |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+
| Users | CREATE TABLE `Users` (
  `ID` bigint(5) NOT NULL DEFAULT '0',
  `NAME` text NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table Purchases;
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table     | Create Table                                                                                                                                                                                                                                                                                                                                                     |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Purchases | CREATE TABLE `Purchases` (
  `PURCHASEID` bigint(19) NOT NULL DEFAULT '0',
  `NAME` text NOT NULL,
  `PURCHASEDBYID` bigint(19) NOT NULL,
  PRIMARY KEY (`PURCHASEID`),
  KEY `Purchases_FK4_IDX` (`PURCHASEDBYID`),
  CONSTRAINT `Purchases_FK4` FOREIGN KEY (`PURCHASEDBYID`) REFERENCES `Users` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

表中的记录:

mysql> select * from Users;
+----+------+
| ID | NAME |
+----+------+
|  1 | Jhon |
+----+------+
1 row in set (0.00 sec)

mysql> select * from Purchases;
+------------+-----------+---------------+
| PURCHASEID | NAME      | PURCHASEDBYID |
+------------+-----------+---------------+
|          1 | purchase1 |             1 |
+------------+-----------+---------------+
1 row in set (0.00 sec)

没有发生锁定等待超时的情况。

在交易1中:

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

mysql> update Users set name="Max" where ID=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

事务1未提交或未回滚。

在交易2中:

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

mysql> insert into Purchases values (2,"purchase2",1);

事务2正在等待对用户表行的S锁。 但是事务1已经在同一行上持有X锁。

在这种情况下,我希望事务2在5分钟后会得到锁定等待时间。

mysql> SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where INFO IS NOT NULL;
+---------+------+-----------+------+---------+------+-----------+---------------------------------------------------------------------+
| ID      | USER | HOST      | DB   | COMMAND | TIME | STATE     | INFO                                                                |
+---------+------+-----------+------+---------+------+-----------+---------------------------------------------------------------------+
| 8545284 | root | localhost | test | Query   |    0 | executing | SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST where INFO IS NOT NULL |
| 8541675 | root | localhost | test | Query   |  308 | update    | insert into Purchases values (2,"purchase2",1)                      |
+---------+------+-----------+------+---------+------+-----------+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

但是没有发生。它正在运行超过5分钟。 背后的原因是什么?请帮助任何一个人。

0 个答案:

没有答案