006 mysql锁

 

step1 MySQL锁介绍(悲观锁)

        mysql在处理并发时采用锁机制;

  • 乐观锁:默认无问题,当问题出现后再加锁;

  • 悲观锁:默认会出现问题,未出现问题的时候就加锁;

 

step2 MySQL表级锁

        表级锁由MySQL SQL layer层实现,表级锁锁定的是表,开销小加锁快,但是锁定粒度大,出现锁冲突的概率高(死锁);

        sql layer主要负责权限判断、sql解析、执行计划优化、query cache的处理等操作,这些操作都是在数据库系统处理底层数据之前的工作;

  • MySQL的表级锁有三种

    -1- 表锁

    -2- 元数据锁(meta data lock,MDL) 

    -3- 意向锁(由Innodb引擎实现)

  • MySQL 实现的表级锁定的争用状态变量

how status like 'table%';

table_locks_immediate:产生表级锁定的次数;
table_locks_waited:出现表级锁定争用而发生等待的次数;

step3 表锁

1、表锁介绍

        表锁有两种表现形式,表共享读锁(Table Read Lock)与表独占写锁(排他写)(Table Write Lock);

--手动增加表锁
lock table 表名称 read(write),表名称2 read(write),其他;
--查看表锁情况
show open tables;
--删除表锁
unlock tables;

2、表锁演示

--新建表
CREATE TABLE mylock (
id int(11) NOT NULL AUTO_INCREMENT,
NAME varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
);
INSERT INTO mylock (id,NAME) VALUES (1, 'a');
INSERT INTO mylock (id,NAME) VALUES (2, 'b');
INSERT INTO mylock (id,NAME) VALUES (3, 'c');
INSERT INTO mylock (id,NAME) VALUES (4, 'd');

2.1表读锁

 

--session1(mysql终端1)、session2(mysql终端2)
1、session1: lock table mylock read; -- 给mylock表加读锁
2、session1: select * from mylock; -- 可以查询
3、session1:select * from tdep; --不能访问非锁定表
4、session2:select * from mylock; -- 可以查询 没有锁
5、session2:update mylock set name='x' where id=2; -- 修改阻塞,自动加行写锁
6、session1:unlock tables; -- 释放表锁
7、session2:Rows matched: 1 Changed: 1 Warnings: 0 -- 修改执行完成
8、session1:select * from tdep; --可以访问

2.2表写锁

--session1(mysql终端1)、session2(mysql终端2)
1、session1: lock table mylock write; -- 给mylock表加写锁
2、session1: select * from mylock; -- 可以查询
3、session1:select * from tdep; --不能访问非锁定表
4、session1:update mylock set name='y' where id=2; --可以执行
5、session2:select * from mylock; -- 查询阻塞
6、session1:unlock tables; -- 释放表锁
7、session2:4 rows in set (22.57 sec) -- 查询执行完成
8、session1:select * from tdep; --可以访问

step4 元数据锁

1、元数据锁介绍

        MDL (metaDataLock) 元数据(即表结构),在 MySQL 5.5 版本中引入了 MDL,当对一个表做(CRUD)增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁。

--session1(mysql终端1)、session2(mysql终端2)
1、session1: begin;--开启事务
select * from mylock;--加MDL读锁
2、session2: alter table mylock add f int; -- 修改阻塞
3、session1:commit; --提交事务 或者 rollback 释放读锁
4、session2:Query OK, 0 rows affected (38.67 sec) --修改完成
Records: 0 Duplicates: 0 Warnings: 0

step5 意向锁

        InnoDB也实现了表级锁,也就是意向锁,意向锁是mysql内部使用的,不需要用户干预;

        意向锁的主要作用是为了【全表更新数据】时的性能提升,否则在全表更新数据时,需要先检索该表是否某些记录上面有行锁。

1.意向共享锁(IS)

        事务在给一个数据行加共享锁前必须先取得该表的IS锁。

2.意向排他锁(IX)

        事务在给一个数据行加排他锁前必须先取得该表的IX锁。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值