mysql怎么释放锁 mysql释放内存命令( 二 )


3、临键锁Next-key-lock,行锁和间隙锁组合 , 同时锁住数据,并锁住数据前面的间隙Gap,在RR隔离级别下支持 。
innodb实现了以下两种类型的行锁
1、共享锁 S: 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁 。
2、排他锁 X: 允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁 。
insert 语句 排他锁 自动添加的
update语句 排他锁 自动添加
delete 语句 排他锁 自动添加
select 正常查询语句 不加锁。。。
select。。。lock in share mode 共享锁 需要手动在select 之后加lock in share mode
select。。。for update 排他锁 需要手动在select之后添加for update
默认情况下,innodb在repeatable read事务隔离级别运行,innodb使用next-key锁进行搜索和索引扫描,以防止幻读 。
间隙锁唯一目的是防止其它事务插入间隙,间隙锁可以共存 , 一个事务采用的间隙锁不会阻止另一个事务在同一间隙上采用的间隙锁 。
Mysql锁表解锁-- 查询是否锁表
show OPEN TABLES ;
-- 查询进程
show processlist ;
-- 查询到相对应mysql怎么释放锁的进程mysql怎么释放锁,然后杀死进程
kill id; -- 一般到这一步就解锁mysql怎么释放锁了
-- 查看正在锁mysql怎么释放锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-- 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-- 解锁表
UNLOCK TABLES;
MySQL锁对表的增删改查,都需要MDL锁,无所不在
MDL读锁之间不互斥,但MDL读写锁互斥
#举个栗子
假设t是一张大表
session1对t执行一个查询(SR)
session2对t执行一个DDL(SU , 可能升级到X)
session3对t执行一个查询(SR)
可知session1持有t表的MDL读锁(SR) , session1的查询还没有结束的时候,去执行session2的DDL(SU),此时session2需要MDL写锁(SU升级到X , 需要X锁),由于MDL读写锁互斥,因此session2需要等待session1释放MDL读锁(SR阻塞X);同时session2对后面的所有MDL读锁互斥(X阻塞SR),因此session2又继续阻塞了session3...
#注释:一开始的DDL能看到的状态是SU,但如果SU的某个阶段被阻塞,会被升级到X,从而引发SR阻塞X , 达到实验的效果 。但实际测试中,DDL是分阶段的,如果没有满足一定的要求,就不会引发阻塞,看到的结果就是SR和SU并没有互相阻塞 。这个过程需要具体的去查看源码 , 此处不展开 。
事务中的MDL锁在语句开始时申请,但并不会在语句结束后就马上释放 , 而是会等到事务结束时才进行释放
忙时对大表DDL会产生的灾难性的结果就是:如果后续对该表有查询操作,而且web端又有重试机制的话 , 那么会有一个新的session再次发起读请求,反复如此,线程池就会在短时间内爆炸
在线执行DDL的时候,需要检查一下information_schema.innodb_trx表中有没有当前操作表对应的事务,此外还可以使用ALTER TABLE tbl_name NOWAIT...进行操作(MySQL8.0新特性)
eg.
session1
select * from cpf where payid'xxx'
union
【mysql怎么释放锁 mysql释放内存命令】 select * from cpf where payid'xxx'
union (union重复50次,确保查询时间几十秒以上)
session2
alter table cpf modify payer_userid varchar(500);
session3
select * from cpf where payer_userid='18051512003600300034';
#执行结果
session1执行了31秒,当session1完成的时候session2和session3相继完成
在session4中执行show processlist , 结果如下

推荐阅读