我正在将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分钟。 背后的原因是什么?请帮助任何一个人。