mysql什么情况下行锁(表锁)(锁的概念)

1:数据表aa的设计结构

在这里插入图片描述

2: 使用navicat编写手动控制事务

在这里插入图片描述

3:先选择开启事务和执行更新操作,where b=1(表锁)b不是索引,不提交事务,(如果where b=1,b是索引就行锁)

在这里插入图片描述

4:这种情况就会抢占锁资源,此时只能对表aa进行查询,不能进行修改,删除和插入。通过如下命令可查看在执行的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

输出:
在这里插入图片描述

5:如果此时执行更新或者插入操作会进行lock锁资源等待,执行不成功,等待锁超时

**(特别注意:一个会话算一个事务,就是现在写的更新,插入和删除和上面开启事务的没有提交的更新不能在一个navicat的窗口,不然都算在一起未提交的事务里面)

在这里插入图片描述

6:可以通过命令查看那些SQL操作在等待锁资源

SELECT * FROM information_schema.`PROCESSLIST` where length(info) >0 ;

在这里插入图片描述
** 注意:可以使用 kill -ID 操作结束等待锁的事务

7:可以通过命令查看那些事务在等待锁和持有资源

在这里插入图片描述
在这里插入图片描述

8:如果要手动锁某个表可以说会用一下命令

--表示只能写不能读
LOCK TABLES aa READ
--表示只能读不能写
LOCK TABLES aa WRITE
--释放所以的读锁和写锁
UNLOCK TABLES 
--查看那些表在占用锁还没释放
show OPEN TABLES where In_use > 0;

猜你喜欢

转载自blog.csdn.net/qq_19891197/article/details/131714781