欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

行级锁,表级锁,乐观锁,悲观锁

程序员文章站 2022-04-18 14:17:29
名词解释表级锁(锁定整个表)行级锁(锁定一行)悲观锁(抽象性,不真实存在这个锁)乐观锁(抽象性,不真实存在这个锁)1.表级锁表级锁,一般是指表结构共享锁锁,是不可对该表执行DDL操作,但对DML操作都不限制。行级锁之前需要先加表结构共享锁。如果用表级锁,其他客户将不能进行查询操作,因此开发中记得用行级锁2.行级锁行级锁,一般是指排它锁,即被锁定行不可进行修改,删除,只可以被其他会话select。行级锁之前需要先加表结构共享锁。联系:在 Mysql 中,行级锁并不是直接...

名词解释

表级锁(锁定整个表)
行级锁(锁定一行)
悲观锁(抽象性,不真实存在这个锁)
乐观锁(抽象性,不真实存在这个锁)

1.表级锁

表级锁,一般是指表结构共享锁锁,是不可对该表执行DDL操作,但对DML操作都不限制。行级锁之前需要先加表结构共享锁

如果用表级锁,其他客户将不能进行查询操作,因此开发中记得用行级锁

2.行级锁

行级锁,一般是指排它锁,即被锁定行不可进行修改,删除,只可以被其他会话select。行级锁之前需要先加表结构共享锁

联系:在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。因为没有了索引,找到某一条记录就得扫描全表,要扫描全表,就得锁定表。

3.悲观锁(其实就是排他锁)

一方:查询语句加 for update;另一方:查询语句加 for update;当进行更新语句的时候,另一方不能进行更新操作

行级锁,表级锁,乐观锁,悲观锁

4.乐观锁

更新语句设置版本号,在指定版本中更新数据

一方:update account set money=money-200,version=version+1 where id=1 and version=0;

另一方操作同一个版本号,则不能更新数据

另一方:update account set money=money+200,version=version+1 where id=1 and version=0;

保证了修改的数据是和它查询出来的数据是一致的,而其他执行程序未进行修改。当然,如果更新失败,表示在更新操作之前,有其他执行程序已经更新了该库存数,那么就可以尝试重试来保证更新成功。为了尽可能避免更新失败,可以合理调整重试次数。

5.悲观锁和乐观锁使用的场合

如果更新多,查询少,用悲观锁;反之,就用乐观锁,其实就是一对互补锁。

乐观锁更新有可能会失败,甚至是更新几次都失败,这是有风险的。所以如果写入较频繁,对吞吐要求不高,可使用悲观锁。

也就是一句话:读用乐观锁,写用悲观锁。

本文地址:https://blog.csdn.net/Lei_5320/article/details/107390163

相关标签: web mysql