mysql事物锁锁表_mysql-事务-行锁-表锁

一、准备:

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()

建表语句

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');

二、测试

使用命令mysql -hx.x.x.x -uroot -p123456 打开连接A,B

连接A:

begin; //查询事务:无

select * from user for update; //查询事务:1个;查询锁:无

表太宽,下面两个图是一条记录:

8a4db06e95a88ea91c8e13b00644356c.png

387957b0926df31d0c6e31b05605c0f4.png

连接B:

begin;

select * from user for update; //查询事务:2个;锁:2个, 如下图

480fbf819d1607b67047832551f290f4.png

0c999dfd7789da3e3c6dc4a504bd4a9c.png

连接B:等待超时

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

再次查询事务:2个;锁:0个

连接B: commit; //B事务结束,只剩下A事务。

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

1、使用索引,行级锁

连接A:

begin;

update user set orderNum=3 where id = 2;

连接B:

select * from user where id=4 for update; //不阻塞

select * from user where id=2 for update; //阻塞。但是连接A只锁了一行,如下图

bd49001f48918b7097bac3043bfa7b27.png

bc380ad27463321db6c78fc883c51e13.png

2、不使用索引,表级锁

连接A:

begin;

update user set orderNum=3 wheremobile=’131’;

连接B:

select * from user where id=4 for update; //阻塞

select * from user where id=2 for update; //阻塞。连接A只锁了4行,如下图

0a8d4554b7b873ac9de180ef65c91955.png

b0a3e822061c606ba03cdb499599e640.png

3、其他测试

连接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查询

连接B:

select * from user for update;

select * from user //非for update查询永不阻塞。

排它锁 for update

共享锁 LOCK IN SHARE MODE

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

锁表

连接A: LOCK TABLES user WRITE; // show OPEN TABLES where In_use > 0; 下图

39605549f287cfd971279195c07bcc42.png

连接B: update user set orderNum=2; //阻塞

连接A: UNLOCK TABLES;

连接B: 阻塞消除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值