MySQL高级【锁】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1锁的概述

锁是计算机协调多个进程或线程并发访问某一资源的机制

在数据库中除传统的计算资源CPU、 RAM、I/O的争用以外数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数据库必须解决的一个问题锁冲突也是影响数据库并发访问性能的一个重要因素。从这个 角度来说锁对数据库而言显得尤其重要也更加复杂。

  • 全局锁锁定数据库中的所有表。

  • 表级锁每次操作锁住整张表。

  • 行级锁每次操作锁住对应的行数据。

2全局锁

2.1介绍

全局锁就是对整个数据库实例加锁加锁后整个实例就处于只读状态后续的DML的写语句DDL语 句已经更新操作的事务提交语句都将被阻塞

其典型的使用场景是做全库的逻辑备份对所有的表进行锁定从而获取一致性视图保证数据的完整 性。

为什么全库逻辑备份就需要加全局锁呢 A. 我们一起先来分析一下不加全局锁可能存在的问题。 假设在数据库中存在这样三张表: tb_stock 库存表tb_order 订单表tb_orderlog 订单日 志表。

  • 在进行数据备份时先备份了tb_stock库存表。

  • 然后接下来在业务系统中执行了下单操作扣减库存生成订单更新tb_stock表插入 tb_order表。

  • 然后再执行备份 tb_order表的逻辑。

  • 业务中执行插入订单日志操作。

  • 最后又备份了tb_orderlog表。

此时备份出来的数据是存在问题的。因为备份出来的数据tb_stock表与tb_order表的数据不一 致(有最新操作的订单信息,但是库存数没减)。 那如何来规避这种问题呢? 此时就可以借助于MySQL的全局锁来解决。 B. 再来分析一下加了全局锁后的情况

对数据库进行进行逻辑备份之前先对整个数据库加上全局锁一旦加了全局锁之后其他的DDL、 DML全部都处于阻塞状态但是可以执行DQL语句也就是处于只读状态而数据备份就是查询操作。 那么数据在进行逻辑备份的过程中数据库中的数据就是不会发生变化的这样就保证了数据的一致性 和完整性。

2.2语法

1). 加全局锁

flush tables with read lock ;

2). 数据备份

mysqldump -uroot –p1234 itcast > itcast.sql

3). 释放锁

unlock tables ;

2.3特点

数据库中加全局锁是一个比较重的操作存在以下问题

  • 如果在主库上备份那么在备份期间都不能执行更新业务基本上就得停摆。

  • 如果在从库上备份那么在备份期间从库不能执行主库同步过来的二进制日志binlog会导致主从延迟。 在InnoDB引擎中我们可以在备份时加上参数 --single-transaction 参数来完成不加锁的一致 性数据备份。

mysqldump --single-transaction -uroot –p123456 itcast > itcast.sq

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql