首页 > 数据库 > MySQL > 正文

mysql中的锁机制深入讲解

2024-07-24 12:49:39
字体:
来源:转载
供稿:网友

前言

为了保证数据的一致完整性,任何一个数据库都存在锁定机制。锁定机制的优劣直接应想到一个数据库系统的并发处理能力和性能,所以锁定机制的实现也就成为了各种数据库的核心技术之一。

大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制。

本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际中关于innodb锁相关的知识及加锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,说说自己的理解,如果发现有不对的地方,欢迎指正。

概述

总的来说,InnoDB共有七种类型的锁:

共享/排它锁(Shared and Exclusive Locks) 意向锁(Intention Locks) 记录锁(Record Locks) 间隙锁(Gap Locks) 临键锁(Next-key Locks) 插入意向锁(Insert Intention Locks) 自增锁(Auto-inc Locks)

mysql锁详解

1. 共享/排它锁(Shared and Exclusive Locks)

共享锁(Share Locks,记为S锁),读取数据时加S锁 排他锁(eXclusive Locks,记为X锁),修改数据时加X锁

使用的语义为:

共享锁之间不互斥,简记为:读读可以并行 排他锁与任何锁互斥,简记为:写读,写写不可以并行

可以看到,一旦写数据的任务没有完成,数据是不能被其他任务读取的,这对并发度有较大的影响。对应到数据库,可以理解为,写事务没有提交,读相关数据的select也会被阻塞,这里的select是指加了锁的,普通的select仍然可以读到数据(快照读)。

2. 意向锁(Intention Locks)

InnoDB为了支持多粒度锁机制(multiple granularity locking),即允许行级锁与表级锁共存,而引入了意向锁(intention locks)。意向锁是指,未来的某个时刻,事务可能要加共享/排它锁了,先提前声明一个意向。

1、意向锁是一个表级别的锁(table-level locking);

2、意向锁又分为:

意向共享锁(intention shared lock, IS),它预示着,事务有意向对表中的某些行加共享S锁; 意向排它锁(intention exclusive lock, IX),它预示着,事务有意向对表中的某些行加排它X锁;

加锁的语法为:

select ... lock in share mode;  要设置IS锁;select ... for update;       要设置IX锁;

事务要获得某些行的S/X锁,必须先获得表对应的IS/IX锁,意向锁仅仅表明意向,意向锁之间相互兼容,兼容互斥表如下:


  IS IX
IS 兼 容 兼 容
IX
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表