乐观锁和悲观锁+行锁和表锁

简介: 【8月更文挑战第2天】

是一种逻辑概念,是并发控制中常用的两种锁机制。

  • 乐观锁是要修改数据的时候,才检测数据释放已经被别人修改过
  • 悲观锁是在初始时刻就直接加锁保护好临界资源

乐观锁在数据库里通常利用CAS的思路进行更新操作,一般的使用形态如下:

SELECT * FROM your_tab WHERE id = 1; // 在这里拿到了 a = 1
// 一大堆的业务操作
UPDATE your_tab SET a = 3, b = 4 WHERE id = 1 AND a =1

在上述的语句里,预期是数据库里a的值是1才会进行更新,如果此时数据库中的值已经被修改了,这个UPDATE语句就会失败。业务方通过判断受影响的行数是否为0,来判断是否更新成功

悲观锁是指写入数据时直接加锁,还是以上面的语句为例,就是从最开始的SELECT语句就直接加上了锁,在加上锁以后可以直接更新了。

在使用悲观锁和乐观锁的时候,需要考虑数据一致性和并发性的问题乐观锁适用于读多写少的场景,互联网大多数应用都是这一种。悲观锁适用于写多读少的场景,比如金融领域里对金额的操作就是以写为主。
相比较下,乐观锁的性能要比悲观锁好很多

行锁和表锁是根据锁的范围来划分的,一般来说,行锁指的是锁住行,可能是一行或多行;表锁则是直接把整个表都锁住。
在MySQL里,InnoDB同时支持行锁和表锁,但是行锁是借助索引来实现的,前面也提到过了,如果查询没有命中任何的索引,那么InnoDB引擎是用不了行锁的,只能用表锁;当然,如果用的是MyISAM引擎,就只能使用表锁,因为这些引擎不支持行锁。

目录
相关文章
|
7月前
|
SQL 数据处理 数据库
乐观锁和悲观锁
乐观锁和悲观锁
72 0
|
3月前
|
SQL XML Java
乐观锁与悲观锁是什么?
本文详细分析了悲观锁和乐观锁的原理、区别、实现方式及应用场景。悲观锁假设冲突频繁,通过加锁保护数据一致性,适用于高并发冲突场景;乐观锁假设冲突较少,通过版本号或时间戳检测冲突,适用于读多写少场景。文章通过具体示例展示了两种锁机制的实现过程,并总结了其优缺点和适用场景,帮助读者根据实际需求选择合适的并发控制机制。
250 4
|
Java API 数据库
什么是乐观锁,什么是悲观锁?
在互联网公司面试中,很多小伙伴都被问到关于锁的理解。今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁、自旋锁、重入锁、读写锁、行锁、表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁。
128 0
|
5月前
|
SQL 监控 Java
深入理解悲观锁与其在并发控制中的应用
深入理解悲观锁与其在并发控制中的应用
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
119 0
|
7月前
|
安全 Java 关系型数据库
乐观锁与悲观锁
【4月更文挑战第11天】乐观锁与悲观锁
50 3
|
7月前
|
关系型数据库 MySQL 数据处理
一文彻底理解乐观锁与悲观锁
一文彻底理解乐观锁与悲观锁
850 0
|
7月前
|
安全 关系型数据库 MySQL
悲观锁和乐观锁
悲观锁和乐观锁
|
NoSQL 算法 Java
乐观锁与悲观锁的实现
本文力求来通俗地讲讲编程中的乐观锁和悲观锁,以及分别是怎么实现的。
103 0
乐观锁与悲观锁的实现
|
负载均衡 Java
聊到悲观锁,是用什么来实现的呢?
优惠券服务是多实例部署形成的负载均衡集群
47 0