数据库
首页 > 数据库> > Mysql锁的类型有哪些

Mysql锁的类型有哪些

作者:互联网

从锁的属性分类:

共享锁: 共享锁又称读锁,简称 S锁,当一个事务为数据加上读锁后,其他事务也只能这些数据加读锁,不能加写锁,当所有事务都释放锁后,才能对这些数据加写锁;主要是为了支持并发读取数据,读取数据时不支持修改数据,避免重复读的问题;
排他锁: 排他锁又称写锁,简称 X锁,当一个事务为数据加上写锁后,其他事务不能再对这些数据加任何锁,直到该锁释放后,其他事务才能加锁;目的是为了修改数据的时候,、不允许其他人同时修改,也不允许其他人读数据,避免数据出现脏读的情况;

从锁的粒度分类

表锁(InnoDB,MylSAL) : 锁的是整张表,当一个事务锁住该表时,其他事务不能访问该表,必须等表锁释放后,才能正常访问表数据;特点是粒度大,虽然加锁简单,但容易冲突;
行锁(InnoDB) : 上锁的时候锁住的是表的某一行或多行记录,其他事务访问同一张表时,只有锁住的记录不能访问,其他数据可以正常访问; 特点是粒度小,比加表锁麻烦,不容易冲突,比表锁支持的并发高;
记录锁: 行锁的一种,只能锁住表中的某一条记录,并且必须是条件精准命中和命中的条件是唯一索引字段;也是避免了脏读的问题;
页锁: 锁住的是相邻的一组数据, 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般;
间隙锁: 行锁的一种,锁住的是一定区间的数据,假如 SELECT * FROM table WHERE id BETWEN 1 AND 10 FOR UPDATE; 那么锁住的数据就是 (1,4]左开右闭这个区间的数据;即使没有 id为3的数据,但 3 这个间隙也会锁住,假如要 insert 一条 id = 3的记录那么就会失败,这种也是避免出现幻读的情况;
临建锁: : 行锁的一种, 如间隙锁类似,不同点事它锁住的区间是闭合区间;假如如 SELECT * FROM table WHERE id BETWEN 1 AND 10 FOR UPDATE; 那么锁住的数据就是 [1,4];
也避免幻读,脏读的情况;

TODO:

标签:事务,加锁,哪些,行锁,锁住,Mysql,类型,数据,id
来源: https://blog.csdn.net/qq_38845271/article/details/119426988