mysql 锁

锁分类

以锁粒度分类:

  1. 全局锁:锁定要操作的数据库里所有的表
  2. 表级锁:锁要操作整张表
  3. 行级锁:锁要操作的一行

全局锁

加锁:flush table with read lock  

解锁:unlock table

数据库逻辑备份:mysqldump -h xxxx -uroot -pxxx tablename>xxx.sql

        对整个数据库加锁,数据库将处于只读状态,所有 DML写操作,DDL操作,更新操作事物提交都会被阻塞。

        使用场景,数据库全库逻辑备份,使用全局s获得一致性视图,保证数据的完整性(如对一个完整业务的逻辑中,对多个表进行修改,这时若没有锁住,则对不同的表备份时,可能会有数据的修改。所以备份出来的逻辑文件,在逻辑上可能出现数据不一致)

表级锁

        锁一张表,粒度大,并发低,表级锁分以下三类

表锁

表锁分类

  1. 表共享读锁 read lock    不会阻塞其他客户端的读,但会阻塞其自己和他客户端的写
  2. 表独占写锁 write lock    阻塞其他客户端的读写,自己可以读写(独占)

加锁语句

  1. 加锁:lock tables tablename  read/write
  2. 释放锁:unlock tables

元数据锁(MDL)

元数据就是表结构,为了避免DML和DDL冲突导致数据不一致,所以有元数据锁

元数据锁分类

  1 读锁(共享)  对一张表进行DML操作时 加DML读锁

  2  写锁(排他)  对一张表进行DDL操作时 加DML写锁

读锁直接共享,读锁和写锁之间互斥

加锁语句

无需显式加锁,当访问一张表的时候系统自动加上元数据锁

事务1执行查询 但未提交 此时加了元数据读锁

 事务2执行 DML操作被阻塞 ,读写锁互斥

查看元数据锁:select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
 

意向锁

        当执行了DML语句,对一行数据进行加锁,此时如果执行DDL对表进行加锁,那么在加表锁的时候就需要先扫描全部的行查找有没有加表锁,为了减少表锁的检查 就使用意向锁。

        当执行DML语句时,加上一个意向锁,当要加表锁的时候直接检查意向锁,判断意向锁和要加的表锁是否兼容,这样就不用再逐行检查行锁了,提供加表锁的效率

意向锁分类

        意向共享锁(IS): select  .. lock in share mode 添加  和表锁read兼容  write 互斥

        意向排他锁  (IX)   : insert  update  delete   select..for update 添加 read/write都互斥 意向锁之间兼容

查看意向锁:select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

行级锁

        只锁对应的一行数据,粒度小,并发高,innodb支持行级锁。行锁是对行的的索引项加锁,不是对行数据加锁。

行锁

对单行加锁,防止其他事务对他进行update delete ,在RC RR 级别下支持

行锁也分

  1. 共享锁(S):允许读,不允许其他事务获得这一行的排他锁 select  .. lock in share mode
  2. 排他锁(X):不允许其他事务获得这一行的共享锁/排他锁inster  update delete select ..for update

间隙锁

锁定索引记录间隙,不包括指定的索引,防止其他事务在间隙中insert 产生幻读,在RR级别下支持

临键锁

锁定索引纪录和前面的间隙,在RR级别下支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值