MySQL中锁使用及原理

本文详细介绍了MySQL中的锁机制,包括全局锁、表级锁、行级锁及其原理,以及死锁的原因和处理方法。重点讨论了MySQL的锁分类,如共享锁、排它锁、意向锁,以及在不同事务隔离级别的应用。同时,文章还探讨了如何通过全局锁进行数据库备份,并解释了InnoDB存储引擎中行级锁的实现细节和自增锁的概念。最后,文章分析了死锁的常见场景,并提供了解决死锁的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、MySQL锁介绍

        数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。因此在数据库系统中,每时每刻都在发生锁定,当用户在修改/删除数据时,MySQL会通过锁定防止其他用户读取同一数据。

        锁是用于管理对公共资源的并发控制。也就是说在并发的情况下,会出现资源竞争,所以需要加锁。加锁解决了多用户环境下保证数据库完整性和一致性。

二、MySQL锁分类

①MySQL底层结构图

②SQL的语法分类

DDL:全称为Data Definition Languages,即数据定义语言,用来定义数据库的对象(数据库,表,字段);

DML:全称为Data Manipulation Languages,即数据操作语言,用来对数据库表中的数据进行增删改;

DQL:全称为Data Query Language,即数据查询语言,用来查询数据库中表的记录。

DCL:全称为Data Control Language,即数据控制语言,用来创建数据库用户、控制数据库的访问权限。

③锁分类

粒度划分:全局锁、表锁、行锁

  • 全局锁

        全局锁对整个数据库处于只读状态,全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

  • 表锁

        表级锁是mysql锁中粒度最大的一种锁,表示当前的操作对整张表加锁,资源开销比行锁少,不会出现死锁的情况,但是发生锁冲突的概率很大。被大部分的mysql引擎支持,MyISAM和InnoDB都支持表级锁,但是InnoDB默认的是行级锁。

  • 行锁

        行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。有可能会出现死锁的情况。

以锁的粒度划分展示图如下

方式划分:共享锁、排它锁、意向读锁、意向写锁

  • 共享锁   (share lock)

        共享锁又称读锁/S锁,针对同一份数据,多个读操作可以同时进行而不会互相影响。

加锁方式

select…lock in share mode

  • 排它锁(exclusive)

        排他锁又称写锁/X锁,当前写操作没有完成前,它会阻断其他写锁和读锁。

加锁方式

select…for update

  • 意向读锁(IS)、意向写锁(IX)

        意向读锁、意向写锁,属于表级锁,S锁和X锁主要针对行级锁。在对表记录添加S或X锁之前,会  先对表添加IS或IX锁。

机制划分: 悲观锁、乐观锁

  • 悲观锁

        在对一条数据修改的时候,为了避免同时被其他人修改,在修改数据之前先锁定,再修改的控制方式。共享锁和排它锁是悲观锁的不同实现,但都属于悲观锁范畴。

  • 乐观锁

        一般的实现方式是对记录数据版本进行比对,在数据更新提交的时候才会进行冲突检测,如果发现冲突了,则提示错误信息。

三、全局锁

        对整个数据库的实例加锁,MySQL提供了一个全局加锁的功能,命令是FLUSH TABLES WITH RED LOCK(FTWRL),当你对整个库仅只读的时候,可以加这个锁,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

①语法

加全局锁:

flush tables with read lock ;

释放全局锁:

unlock tables;

②使用场景

        全库逻辑备份、全库导出等,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。 在做备份数据或者导入导出数据操作的时候,如果这个系统期间还可以进行数据的增、删、改,那么就会有数据不一致产生。

Ⅰ、启动会话A,会话B;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值