mysql-事务-行锁-表锁

1、准备:

  • SELECT * FROM information_schema.innodb_trx ; //查询事务
  • SELECT * FROM information_schema.innodb_locks; //查询锁
  • SELECT * FROM information_schema.innodb_lock_waits; //暂时不用
  • show status like ‘innodb_row_lock%’; //暂时不用
  • show OPEN TABLES where In_use > 0; //查看锁表,用来dump数据,不是表级锁//
  • show processlist //查看正在执行的进程。最重要的一列:state()

建表语句mysql

CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `orderNum` varchar(255) NOT NULL, `mobile` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `un_name` (`name`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('2', 'a', '1', '131');
INSERT INTO `user` VALUES ('4', 'b', '2', '132');
INSERT INTO `user` VALUES ('6', 'c', '3', '186');

2、测试

  1. 使用命令mysql -hx.x.x.x -uroot -p123456 打开链接A,Bweb

  2. 链接A:
    begin; //查询事务:无
    select * from user for update; //查询事务:1个;查询锁:无
    表太宽,下面两个图是一条记录:
    表太宽前半部分
    表太宽后半部分sql

  3. 链接B:
    begin;
    select * from user for update; //查询事务:2个;锁:2个, 以下图
    这里写图片描述
    这里写图片描述svg

  4. 链接B:等待超时
    ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
    再次查询事务:2个;锁:0个测试

  5. 链接B: commit; //B事务结束,只剩下A事务。spa

3、测试:行级锁,表级锁

一、使用索引,行级锁

  1. 链接A:
    begin;
    update user set orderNum=3 where id = 2;
  2. 链接B:
    select * from user where id=4 for update; //不阻塞
    select * from user where id=2 for update; //阻塞。可是链接A只锁了一行,以下图
    这里写图片描述
    这里写图片描述

二、不使用索引,表级锁

  1. 链接A:
    begin;
    update user set orderNum=3 wheremobile=’131’;
  2. 链接B:
    select * from user where id=4 for update; //阻塞
    select * from user where id=2 for update; //阻塞。链接A只锁了4行,以下图
    这里写图片描述
    这里写图片描述

三、其余测试

  1. 链接A:
    begin;
    update user set orderNum=2 where mobile like ‘13%’; //B会阻塞
    //update user set orderNum=2; //效果同上。
    //select count(*) from user for update; //效果同上
    //select count(*) from user; //不会阻塞链接B的for update查询3d

  2. 链接B:
    select * from user for update;
    select * from user //非for update查询永不阻塞。rest

  3. 排它锁 for updatecode

  4. 共享锁 LOCK IN SHARE MODE

4、锁表,用来dump数据等,不是表级锁

锁表
链接A: LOCK TABLES user WRITE; // show OPEN TABLES where In_use > 0; 下图
这里写图片描述
链接B: update user set orderNum=2; //阻塞
链接A: UNLOCK TABLES;
链接B: 阻塞消除orm