锁机制

        锁是计算机协调多个线程并发处理某一资源的机制,类似于java中的synchronized。mysql中锁分为全局锁、表级锁、行级锁。

一、全局锁

        对整个数据库实例加锁,所有数据处于只读状态。用于对数据库所有数据备份,保持数据完整性。加全局锁:

        flush tables with read lock;

        数据备份:

                mysqldump -uroot -p$$$$$ 数据库名>保存的文件名.sql(在windows命令行执行

Notations:在mysqldump 后面加上--single-transaction可以实现不加锁的数据备份

        释放:

                unlock tables;

        缺点:(1)备份期间不能执行其他业务;(2)如果在从库备份,备份期间不能执行主库的二进制日志,导致主从延迟。

二、表级锁

        只锁整张表。主要分为:(1)表锁;(2)元数据锁;(3)意向锁

2.1 表锁

        又分为表共享读锁(read lock)和表独占写锁(write lock)

        加锁:lock tables 表名 read/write;   释放锁:unlock tables;

        如果在一个链接中对表加了read lock,那么该链接和其他连接都只能对其执行DQL语句。

        而如果一个链接对表加了write lock,那么该链接可以对其执行任何语句,而其他不能执行任何语句

2.2 元数据锁(meta data loak,MDL)

        MDL是系统自动控制,元数据简单就是指的表结构。MDL主要作用是维护表元数据一致性,在表上有事务活动时,不可写入元数据。避免DML和DDL语句的冲突。

        mysql在执行DML时,自动加读锁(共享)。对表结构变更时,自动加写锁(排他)

        sql语句对应的元数据锁:

  2.3 意向锁

        为避免DML语句执行时,表锁和行锁的冲突,innoDB加入了意向锁,避免表锁搜索每行看有没有行锁及行锁类型。分为两种:(1)意向共享锁(IS):select .... lock in share mode;(2)意向排他锁(IX):由insert,update等添加。

        IS与表锁read兼容,与表锁write排斥,而IX与两者都排斥。意向锁之间不会互相排斥。

        例如加上IS:

                select * from students where sid='01' lock in share mode;

        IX在执行一些SQL语句时就会自动添加。

三、行级锁        

        主要用在InnoDB中,只锁一行的数据。行级锁依赖于索引项加锁。

3.1 行锁

        锁住一行的数据,防止其他事务进行update和delete。在read committed和read uncommitted下都支持。InnoDB中有两种类型的行锁:(1)共享锁(S):允许一个事务读一行,防止其他事务获得相同数据集的排他锁。(2)排他锁 (X):允许获取排他锁的事务更新数据,防止其他事务获得相同数据集的共享锁和排他锁。

        I和S的关系如下所示:

        

          加锁如下:

         一旦事务提交或回滚,锁自动释放。当两个客户端同时执行一行数据,都加上了锁,当两个锁互相排斥时,那么一边就会出现阻塞。

Notations:不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,行锁升级为表锁。

3.2 间隙锁和临建锁

        锁定索引记录间隙,确保索引记录间隙不变,防止其他事务进行insert。在repetable read 下支持。

        临建锁是行锁和间隙锁的组合。在repetable read下支持。

        默认情况下,InnoDB在repeatable read的隔离级别运行,引擎使用next-key进行搜索和扫描,防止幻读。出现这两种锁的情况:(1)索引上的等值查t询(唯一索引),给不存在的记录加锁,会优化为间隙锁;(2)索引上的等值查询(普通索引),向右遍历到最后一个值不满足查询需求时,next-key退化成间隙锁;(3)索引上的范围查询(唯一索引),会访问到不满足条件的第一个值为止。

Notations:

1,比如只有id=3和8的记录,查询5,就会给3和8之间的记录加上间隙锁,再在另一个事务中修改id=7的数据就会阻塞。

2,比如有age=19和age=25的记录,查询大于19的记录加上share in mode,会给19的记录加上行锁,并且给25直到正无穷的记录加上临建锁。

3,间隙锁唯一目的是防止其他事务插入间隙,间隙锁可以共存,一个事务的间隙锁不会防止另一个事务在同一间隙加上间隙锁。

        

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值