Mysql 锁

本文深入解析MySQL中的三种锁机制——表级锁、行级锁和页级锁的特点及应用场景,并重点介绍了MyISAM引擎的表锁和InnoDB引擎的行锁机制,包括锁的兼容性和加锁方式。

MySQL支持多种存储引擎,不同的存储引擎对应着不同的锁机制,用来适应不同的业务需求。

MySQL有三种锁:

1、表级锁:开销小、加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率最高,并发度低。(MyISAM引擎,MEMORY引擎)

            表级锁适合已查询为主,只有少量按索引更新的数据的应用。

2、行级锁:开销大、加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高。(InnoDB引擎)

            行级锁更适合有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,对并发性要求较高的应用。

3、页级锁:开销和加锁介于表级锁和行级锁之间,会出现死锁;锁定粒度也介于两者之间,并发度一般。

 

详细说一下每个引擎对应锁机制的基本使用

1、MyISAM表锁

锁兼容

 读锁(S)写锁(X)
读锁(S)兼容不兼容
写锁(X)不兼容不兼容

加写锁:lock table table_name write;

加读锁:lock table table_naem1,table_name2 read local;

释放锁:unlock tables;

 

写锁阻塞例子:

当前Session加 写锁,释放锁之前,其他Session读锁住的表,会等待锁释放后才能读。

 

读阻塞例子:

1)当前Session 加读锁后,不能读取没有锁定的表。

2)当前Session插入和更新锁定的表会报错。

3)其他Session可以更新查询未锁定的表,但不能对锁定的表进行操作。

还有一点要特别注意:

一次锁定所有用到的表,同一表在SQL中出现多次,就要通过SQL语句中相同别名锁定多少次。

 

2、InnoDB行锁

InnoDB与MyISAM不同的有两点:

1)支持事务     2)采用行级锁

 

一、事务的概述和讲解

事务的四个属性:

1)原子性:事务是一个原子操作单元,对数据修改,要不全部执行,或都不执行。

2)一致性:开始和完成时,数据必须保持一致(索引)。

3)隔离性:互相隔离,不同Session或不同事务互不影响。

4)持久性:事务后,对数据的修改时永久的

但是事务在并发中也会有相应的弊端:

1)更新数据的丢失:A、B两个事务,对同一事务进行修改,不加锁的情况,后一个Session更新会将前一个Session更新覆盖。

2)脏读:A对数据进行修改,如果不做锁处理,B拿取到的脏数据,同时进行了处理,就会产生未提交的数据依赖。

3)幻读:A以相同条件检索两次,第二次发现其他插入满足其检索条件。

 

二、InnoDB锁讲解

InnoDB 有两种行锁和两种表锁

两种行锁:

     1)排他锁(X):允许获得该锁的事务更新数据,阻止其他事务取得相同数据集的共享锁和排他锁。

     2)共享锁  (S)   :允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

两种表锁:

     1)意向共享锁(IS):给数据加共享锁,要先获得该表的IS锁。

     2)意向排他锁(IX):加排他锁前,要先获得该表的IX锁。

 

加行锁方式:

共享锁:Select   .........  from talbe_name   lock in share mode;

排他锁:Select  ........... from table_name for update;

 

InnoDB锁兼容性

 XIXSIS
X不兼容不兼容不兼容不兼容
IX不兼容兼容不兼容兼容
S不兼容不兼容兼容 
IS不兼容兼容兼容兼容

 

### MySQL 机制详解 MySQL 中的机制是为了保障数据库在高并发环境下的数据一致性和稳定性而设计的重要功能之一。以下是关于 MySQL 机制的具体解析: #### 1. 的分类 MySQL 主要分为两种类型的。 - ** (Table-Level Lock)** 是最简单的定策略,适用于 MyISAM 存储引擎。它会在整个上施加,无论是读操作还是写操作都会影响到整张。对于 `SELECT` 操作,MyISAM 会自动给涉及的所有加上读;而对于 `UPDATE`, `INSERT`, 和 `DELETE` 则会自动加上写[^3]。 - ** (Row-Level Lock)** 由 InnoDB 存储引擎实现,提供更高的并发能力。只有涉及到具体记录的操作才会触发。例如,在执 `SELECT ... FOR UPDATE` 或者 `SELECT ... LOCK IN SHARE MODE` 时,InnoDB 只会对符合条件的特定而不是封整个[^2]。 #### 2. 不同存储引擎的特性 不同的存储引擎有不同的为: - **MyISAM**: 默认使用的是级别的,这意味着即使是一个小范围内的更新也会阻塞其他线程对该任何部分的访问[^3]。 - **InnoDB**: 支持事务以及更细粒度的,这使得它可以更好地处理复杂的多用户场景下的并发请求[^4]。 #### 3. 常见类型及其作用 除了基本的级与级区分外,还有几种具体的形式用于满足不同需求: - **共享 (Shared Lock, S-Lock)** 当一个客户端通过命令如 `LOCK TABLES table_name READ` 获取了一个上的共享之后,其它客户也可以获得该上的共享,但不能再获取排他直到当前持有共享的所有连接释放它们为止[^2]。 - **排他 (Exclusive Lock, X-Lock)** 排他允许独占式的修改权限。如果某个事务已经获得了某条记录或者某些列上的排他,则在此期间不允许别的事务再对此同一组资源申请任何形式的新——既包括另外的排他也包括新的共享[^2]。 - **GAP ** 这种特殊的用来阻止新纪录插入到现有两条连续记录之间的空隙(gap)里去。比如当我们运下面这条SQL语句的时候就会用到gap lock:`SELECT * FROM table_name WHERE id > 10 FOR UPDATE;` - **Next-Key Lock** 是一种组合了索引记录本身(record)和其前面那个区间(gap)两者一起保护起来的一种复合型模式。主要用于解决可重复读(repeatable read)隔离级别下可能出现的幻影问题(phantom problem)[^4]。 #### 4. 死现象及预防措施 死是指两个或更多事务相互等待对方持有的资源从而进入僵局的状态。为避免这种情况发生可以采取以下方法: - 尽量按照固定的顺序访问资源; - 减少单次事务持续时间; - 设置合理的超时参数让系统能够及时发现并终止潜在的死循环状况等等[^4]。 ```sql -- 示例:如何手动解 UNLOCK TABLES; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值