当前位置: 移动技术网 > IT编程>数据库>Mysql > 行级锁,表级锁,乐观锁,悲观锁

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

2020年07月18日  | 移动技术网IT编程  | 我要评论

名词解释

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网