没有合适的资源?快使用搜索试试~ 我知道了~
MySQL锁的详细介绍
资源推荐
资源详情
资源评论














锁机制和实战
一、锁分类
在 MySQL中锁有很多不同的分类。
1.1 从操作的粒度可分为表级锁、行级锁和页级锁。
表级锁 :每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在
MyISAM、 InnoDB、 BDB 等存储引擎中。
行级锁 :每次操作锁住一行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在
InnoDB 存储引擎中。
页级锁 :每次锁定相邻的一组记录,锁定粒度界于表锁和行锁之间,开销和加锁时间界于表锁和行
锁之间,并发度一般。应用在BDB存储引擎中。
1.2 从操作的类型可分为读锁和写锁。
读锁(S锁):共享锁,针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(X锁):排他锁,当前写操作没有完成前,它会阻断其他写锁和读锁。
IS锁、
IX锁:意向读锁、意向写锁,属于表级锁, S和X主要针对行级锁。在对表记录添加S或X锁之前,会
先对表添加IS或IX锁。
S锁 :事务A对记录添加了S锁,可以对记录进行读操作,不能做修改,其他事务可以对该记录追加 S锁,
但是不能追加X锁,需要追加X锁,需要等记录的S锁全部释放。
X锁 :事务A对记录添加了X锁,可以对记录进行读和修改操作,其他事务不能对记录做读和修改操作。
1.3 从操作的性能可分为乐观锁和悲观锁。
乐观锁 :一般的实现方式是对记录数据版本进行比对,在数据更新提交的时候才会进行冲突 检测,
如果发现冲突了,则提示错误信息。
悲观锁 :在对一条数据修改的时候,为了避免同时被其他人修改,在修改数据之前先锁定, 再修改
的控制方式。共享锁和排他锁是悲观锁的不同实现,但都属于悲观锁范畴。
二、行锁原理

在InnoDB引擎中,我们可以使用行锁和表锁,其中行锁又分为共享锁和排他锁。 InnoDB行锁是通过对索
引数据页上的记录加锁实现的 ,主要实现算法有 3 种:Record
Lock、Gap Lock 和 Next-key Lock。
RecordLock锁 :锁定 单个行记录 的锁。
(
记录锁, RC、 RR隔离级别都支持)
GapLock锁 :间隙锁,锁定 索引记录间隙 ,确保索引记录的间隙不变。
(
范围锁, RR隔离级别支持)

Next-key Lock锁 :记录 锁和间隙锁 组合,同时锁住数据,并且锁住数据前后范围。(记录锁+范围
锁, RR隔离级别支持)
在RR隔离级别,
InnoDB对于记录加锁行为都是先采用Next-Key
Lock,但是当SQL操作含有唯一索引
时, Innodb会对Next-Key
Lock进行优化,降级为RecordLock,仅锁住索引本身而非范围。
select
… from 语句:InnoDB引擎采用MVCC机制实现非阻塞读,所以对于普通的select语句,
InnoDB不加锁。
select
… from
lock
in
share
mode语句:追加了共享锁,
InnoDB会使用Next-Key Lock锁进行处
理,如果扫描发现唯一索引,可以降级为RecordLock锁。
select
… from for
update语句:追加了排他锁, InnoDB会使用Next-Key Lock锁进行处理,如果扫
描发现唯一索引,可以降级为RecordLock锁。
update
… where 语句:InnoDB会使用Next-Key Lock锁进行处理,如果扫描发现唯一索引,可以
降级为RecordLock锁。
delete … where 语句:InnoDB会使用Next-Key
Lock锁进行处理,如果扫描发现唯一索引,可以降
级为RecordLock锁。
insert语句:InnoDB会在将要插入的那一行设置一个排他的RecordLock锁。
下面以“ update t1 set name=‘XX’ where id=10 ”操作为例,举例子分析下 InnoDB 对不同索引的加
锁行为,以RR隔离级别为例。
主键加锁
加锁行为:仅在id=10的主键索引记录上加X锁。
唯一键加锁
剩余10页未读,继续阅读
资源评论


vvoennvv
- 粉丝: 605
- 资源: 310
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
