微信公众号:爱动漫的程序员
关注可了解更多的教程及排版技巧。问题或建议,请公众号留言
MYSQL InnoDB锁类型
l 共享锁(行锁):Shared Locks
l 排它锁(行锁):Exclusive Locks
l 意向锁共享锁(表锁):Intention Shared Locks
l 意向锁排它锁(表锁):Intention Exclusive Locks
l 自增锁:AUTO-INC Locks
行锁的算法
l 记录锁 Record Locks
l 间隙锁 Gap Locks
l 临键锁 Next-key Lock
共享锁(Shared Locks) VS 排它锁(Exclusive Locks)
共享锁:
又称读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁, 都能访问到数据,但是只能读不能修改;
加锁释锁方式:
select * from users WHERE id=1 LOCK IN SHARE MODE
;
commit/rollback
排他锁:
又称为写锁,
简称X锁,排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他 锁,其他事务就不能再获取该行的锁(共享锁、排他锁),只有该获取了排他锁的事务是可以对 数据行进行读取和修改,(其他事务要读取数据可来自于快照)
加锁释锁方式:
delete / update / insert 默认加上X锁
SELECT * FROM table_name WHERE … FOR UPDATE
commit/rollback
innodb-行锁到底锁了什么?
InnoDB的行锁是通过给索引
上的索引项加锁来实现的。
只有通过索引条件进行数据检索
,InnoDB才使用行级锁,否则,InnoDB 将使用表锁(锁住索引的所有记录)
表锁:lock tables xx read/write;
意向共享锁(IS)&意向排它锁(IX)
意向共享锁(IS)
表示事务准备给数据行加入共享锁,即一个数据行加共享锁前必须先取得该表的IS锁, 意向共享锁之间是可以相互兼容的
意向排它锁(IX)
表示事务准备给数据行加入排他锁,即一个数据行加排他锁前必须先取得该表的IX锁, 意向排它锁之间是可以相互兼容的
意向锁(IS、IX)是InnoDB数据操作之前自动加的,不需要用户干预
意义:
当事务想去进行锁表时,可以先判断意向锁是否存在,存在时则可快速返回该表不能 启用表锁
自增锁AUTO-INC Locks
针对自增列自增长的一个特殊的表级别锁
show variables like 'innodb_autoinc_lock_mode';
默认取值1,代表连续,事务未提交ID永久丢失
(即我们所采用的mysql的自增主键所使用的的锁.)
记录锁(Record)&间隙锁(Gap)&临键锁(Next-key)
Next-key locks
:
锁住记录+区间(左开右闭)
当sql执行按照索引进行数据的检索时,查询条件为范围查找
(between and、<、>等)并有数据命中
则此时SQL语句加上的锁为Next-key locks
,锁住索引的记录+区间(左开右闭
)Gap locks
:
锁住数据不存在的区间(左开右开)
当sql执行按照索引
进行数据的检索时,查询条件的数据不存在
,这时SQL语句加上的锁即为 Gap locks
,锁住索引不存在的区间(左开右开
)Record locks
:
锁住具体的索引项
当sql执行按照唯一性
(Primary key、Unique key)索引
进行数据的检索时,查询条件等值匹 配且查询的数据是存在,这时SQL语句加上的锁即为记录锁Record locks
,锁住具体的索引项
.
临键锁

为什么INNODB选择临键锁Next-key做为行锁的默认算法?
如上图所示的查询示例,当进行索引范围查找
的时候,如果命中了当前表中记录ID=7的记录,则会在7的左临键区间和右临键区间加上临键锁
.即区间(4,7],(7,10]
.这时候,如果有人对该区间进行插入操作,如插入一条ID=5的记录,则会进行等待
,直到当前范围查询释放临键锁
.这种上锁方式有效的避免了虚读
的错误性.使得当前查询有效的返回当前范围的正确记录.
间隙锁(GAP)

记录锁(Record)

利用锁解决脏读,幻读,不可重复读







