MySQL的锁有哪些类型

基于锁的属性分类:共享锁(读锁)、排他锁(写锁)
基于锁的粒度分类:行级锁((innodb )、表级锁( innodb、myisam)、页级锁( innodb引擎)、记录锁、间隙锁、临键锁
基于锁的状态分类:意向共享锁、意向排它锁(一般不用)。

按属性分:
共享锁(share lock):共享锁又称读锁,简称S锁;当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,而不能对数据加写锁,直到所有的读锁释放之后其他事务才能对其进行加持写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复读的问题


排他锁(exclusive lock)︰排他锁又称写锁,简称×锁;当一个事务为数据加上写锁时,其他请求将不能再为数据加任何锁,直到该锁释放之后,其他事务才能对数据进行加锁。排他锁的目的是在数据修改时候,不允许其他人同时修改,也不允许其他人读取,避免了出现脏数据和脏读的问题
 

按粒度分:
行锁:行锁是指上锁的时候锁住的是表的某一行或多行记录,其他事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问,特点:粒度小,加锁比表锁麻烦,不容易冲突,相比表锁支持的并发要高

表锁(table lock):表锁是指上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能进行对表进行访问;特点:粒度大,加锁简单,容易冲突;


页锁:页级锁是MysQL中锁定粒度介于行级锁和表级锁中间的一种锁.表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。特点:开销和加锁时间界于表锁和行锁之间,会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。


记录锁(Record lock):记录锁也属于行锁中的一种,只不过记录锁的范围只是表中的某一条记录,记录锁是说事务在加锁后锁住的只是表的某一条记录,加了记录锁之后数据可以避免数据在查询的时候被修改的重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题


间隙锁:是属于行锁的一种,间隙锁是在事务加锁后其锁住的是表记录的某一个区间,当表的相邻ID之间出现空隙则会形成一个区间,遵循左开右闭原则。范围查询并且查询未命中记录,查询条件必须命中索引、间隙锁只会出现在REPEATABLE_READ(重复读)的事务级别中。


临键锁(Next-Key lock):也属于行锁的一种,并且它是INNODB的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙空间也会锁住
再之它会把相邻的下一个区间也会锁住。

 

### MySQL 类型概述 在MySQL中,机制用于确保数据的一致性和完整性,防止多个事务同时修改相同的数据而导致冲突。根据不同的应用场景和需求,MySQL提供了多种类型来实现这一目标。 #### 表级 (Table-Level Locks) 表级是最简单的定策略之一,适用于较低并发量的应用环境。当一个会话获得了一张表上的写入时,其他任何试图对该表进行读取或写入操作的会话都将被阻塞直到前者的操作完成并释放[^1]。这种类型虽然简单易懂,但在高并发环境下效率低下,因为它不允许多线程并发执行针对同一表格的操作。 #### 全局 (Global Locks) 全局可以看作是一种极端形式的表级——它不仅限于单个特定的表而是作用在整个实例上。这意味着一旦设置了全局只读模式或其他类似的全库范围内的定措施,则整个服务器内所有未提交的事物都不能再做更改动作;新发起的一切DML语句都会失败除非它们属于那些已经被允许例外处理的情况之外。显然这通常仅用于维护期间如备份恢复等特殊时刻而非日常业务流程之中。 #### 记录 (Row-Level Locks 或 Record Locks) 相比之下更为精细的是记录级别的定方式,也就是常说的行为级或者行级别定。这类方法能够精确到具体某一行甚至某个字段上面去实施保护从而极大提高了系统的吞吐能力特别是在面对大量并发请求的时候表现尤为突出。例如,在`SELECT ... FOR UPDATE`查询里指定条件匹配到的结果集会被加上排他性的X以阻止其它连接对其进行更新删除之类的变更行为直至当前事物结束为止[^3]。 ```sql -- 加读取一条记录 SELECT * FROM table_name WHERE id = 1 FOR UPDATE; ``` 通过上述三种主要类别可以看出,不同层次的定各有优劣之处,合理选用取决于具体的使用场景和技术架构考量因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值