56,687
社区成员
发帖
与我相关
我的任务
分享
# 建表语句
CREATE TABLE `tab_no_index` (
`id` INT(11) NULL DEFAULT NULL,
`name` VARCHAR(10) NULL DEFAULT NULL
)
ENGINE=InnoDB;
# 插如(1, '1')、(2, '2')、(3, '3')、(4, '4')四条数据的SQL省略
# 会话1
set autocommit=0;
select * from tab_no_index a where id = 1 for update;
# 不提交
# 会话2
set autocommit=0;
# 下面的语句无法执行,需等待会话1提交。
select * from tab_no_index a where id = 2 for update;
# 会话1
set autocommit=0;
update tab_no_index a
set a.name = 'abc'
where a.id = 1;
# 不提交
# 会话2
set autocommit=0;
# 下面这个update语句可以执行
update tab_no_index a
set a.name = 'abc'
where a.id = 2;
#会话1
mysql> SET autocommit=0;
QUERY OK, 0 ROWS affected (0.03 sec)
#1
mysql> SELECT * FROM tab_no_index a WHERE id = 1 FOR UPDATE;
+------+------+
| id | NAME |
+------+------+
| 1 | 1 |
+------+------+
1 ROW IN SET (0.03 sec)
mysql> COMMIT;
QUERY OK, 0 ROWS affected (0.03 sec)
#2
mysql> UPDATE tab_no_index a
-> SET a.name = 'abc'
-> WHERE a.id = 1;
QUERY OK, 1 ROW affected (6.13 sec)
ROWS matched: 1 CHANGED: 1 WARNINGS: 0
#会话2
mysql> SET autocommit=0;
QUERY OK, 0 ROWS affected (0.03 sec)
#1
mysql> SELECT * FROM tab_no_index a WHERE id = 2 FOR UPDATE;
ERROR 1205 (HY000): LOCK WAIT timeout exceeded; try restarting TRANSACTION
mysql> COMMIT ;
QUERY OK, 0 ROWS affected (0.03 sec)
#2
mysql> UPDATE tab_no_index a
-> SET a.name = 'abc'
-> WHERE a.id = 2;
ERROR 1205 (HY000): LOCK WAIT timeout exceeded; try restarting TRANSACTION
mysql>