全局锁和表锁

锁的出现

1. 数据库锁设计的初衷是解决并发问题
2. 作为多用户共享的资源,当出现并发访问时,数据库需要合理的控制资源的访问规则,而锁就是用来实现这些访问规则的重要数据结构

锁的分类

1. 全局锁(解决全库逻辑备份问题)
2. 表级锁
3. 行锁

全局锁

就是对整个数据库实例加锁

加全局读锁的语句:

flush tables with read lock

当你需要让整个库都处于只读状态时,可以使用这个命令,之后其他线程的以下语句会被阻塞:

  • 数据更新语句(数据的增删改)
  • 数据定义语句(包括建表,修改表结构)
  • 更新类事务的提交语句

全局锁的使用场景:做全库逻辑备份,也就是把整个库都Select出来存成文本

  • 如果不做全局备份的话,备份系统备份得到的库不是一个逻辑时间点,这个视图是逻辑不一致的

做全库逻辑备份不同全局锁,用mysqldump

mysqldump是官方自带的逻辑备份工具,利用mvcc和可重复读,保证在备份过程中可以进行正常的数据更新
mysqldump -single-transaction

原理

  • 导数据之前会启动一个事务(可重复读隔离级别),来确保拿到一致性视图

缺点:

  • 不支持事务隔离级别的引擎无法实现,只能加全局锁进行备份

另一种设置全库只读的方式

使用语句:

set readonly = true

缺点:

  • 有些系统readOnly的值会做其他的判断逻辑,比如用来判断一个库是主库还是从库,因此,修改gloable影响面更大,不建议使用
  • 异常处理机制不一样,如果客户端连接因为异常断开,加全局锁的话会自动释放锁,设置全库只读的话会使整个库一直处于只读状态

表级锁

mysql里面表级锁有两种:
1: 表锁
2: 元数据锁

表锁

语法:

lock tables ... read/write
可以使用unlock tables主动释放锁
也可以在客户连接时主动释放:
注意:lock tables除了会限制别的线程的读写外,也限定了本线程接下来的操作对象

如果线程A执行了lock tables t1 read,则在释放锁之前,自己只能对表t进行读操作

MDL(metadata lock)

mdl不需要显示的使用,在访问一个表的时候会自动的被加上mdl

MDL的作用是保证读写的正确性:当对一个表做增删改查操作时,加MDL读锁,当要做表结构变更时,加MDL写锁

  • 读锁之间不互斥,可以有多个线程同时对一张表做增删改查
  • 读写锁之间,写锁之间是互斥的
    事务中的MDL锁,在语句执行时开始申请,但是语句结束后不会马上释放,而会等到整个事务提交后释放
    因此要进行表结构变更时,一定要先Kill掉长事务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值