给你讲明白MySQL的乐观锁和悲观锁

news/2024/11/29 1:49:52/

乐观锁与悲观锁是一种广义上的概念。不管是 Java 语言,也或者是其他语言以及数据库都有这类概念对应的实际应用。想要学习乐观锁和悲观锁就要学习他们的基本知识,那么下面我们来学习一下。


 

生活中:锁在我们身边无处不在,比如我出门玩去了需要把门锁上,比如我需要把钱放到保险柜里面,必须上锁以保证我财产的安全。

代码中:比如多个线程需要同时操作修改共享变量,这时需要给变量上把锁(syncronized),保证变量值是对的。

数据库表:当多个用户修改表中同一数据时,我们可以给该行数据上锁(行锁)。

悲观锁(悲观并发控制)

当我们要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发的发生。

为什么叫做悲观锁呢?因为这是一种对数据的修改抱有悲观态度的并发控制方式。我们一般认为数据被并发修改的概率比较大,所以需要在修改之前先加锁。

数据库中的行锁,表锁,读锁,写锁,以及 syncronized 实现的锁均为悲观锁。

乐观锁

乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁,只有到数据提交的时候才通过一种机制来验证数据是否存在冲突。

乐观锁通常是通过在表中增加一个版本(version)或时间戳(timestamp)来实现,其中,版本最为常用。

乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行 +1 操作,否则就执行失败。

悲观锁图解:

 

乐观锁图解:


 说一下乐观锁和悲观锁?

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。

数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。


如何选择

乐观锁适用于多读的场景,也就是冲突很少发生的场景,此时使用乐观锁就可以大大降低了锁的开销,也就使得系统的吞吐量得到提升;但是如果在多写的场景下,写入的过程可能会经常产生冲突,这时候如果使用乐观锁就会导致上层应用会不断的进行重试(写入一次不成就写入两次,两次不成就写入三次…),这样反倒是降低了性能,所以在多写的场景下使用悲观锁就比较合适了。


以上就是今天的分享,如果你喜欢记得点赞评论哟,你们的点赞评论是我继续分享的动力!

(以上部分文字及图片整理于网络,如有侵权联系删除)


http://www.ppmy.cn/news/2526.html

相关文章

【Zookeeper】学习笔记(二)

Zookeeper学习笔记四、客户端命令4.1、新增节点4.2、查询节点信息4.3、节点类型4.4、更新节点4.5、删除节点4.6、监听器五、SpringBOOT整合Zookeeper六、写数据流程6.1、写流程之写入请求直接发送给Leader节点6.2、写流程之写入请求发送给follower节点七、服务器动态上下线监听…

Spring从入门到精通(二)

文章目录1.动态代理1.1 概念1.2 jdk动态代理(重点)1.3 基于子类的动态代理(了解)2.AOP2.1 概念2.2 springAop — 基于AspectJ技术2.2.1 AspectJ使用(XML)2.2.2 AspectJ使用(注解开发&#xff09…

c语言---指针进阶(2)--玩转指针

今天内容不多,但都是精华。 1.数组参数和指针参数 2.函数指针 2.1笔试题 3.函数指针数组 1.数组参数和指针参数 例1:一维数组传参 void test(int arr[]) {} void test(int arr[10]) {} void test(int *arr) {}void test2(int *arr2[20]) {} void …

Verilog语法之generate for、generate if、generate case

0、前言 Verilog-2005中有3个generate 语句可以用来很方便地实现重复赋值和例化(generate for)或根据条件选择性地进行编译(generate if和generate case)等功能。接下来就一起看下这3个语句的应用场景和应用方法吧。 1、generate …

Laravel 某个固定数据排序在列表顶部sql查询(自定义排序)

业务需要列表中某个固定用户数据处于列表顶部,该用户author状态有多个值(例如:1-999),需要置于顶部的为中间的某个值(例如:author68) 实现方式: 1、判断 author的值是不…

Web服务器通信原理

电脑: Windows 系统 微软开发 闭源 Linux 开源的系统(无数的子系统) Mac os 苹果系统 WEB 安全 > WEB的安全(网站安全) 服务器: 就是一台不关机的电…

Properties类的使用

Properties类是一个配置文件类,主要作用就是用来封装配置文件,将配置文件加载成为一个Properties对象。 注意:Properties类一般用来加载 .properties配置文件 首先看一下.properties配置文件的样子 driverClassNamecom.mysql.cj.jdbc.Drive…

LeetCode刷题复盘笔记—一文搞懂完全背包之139. 单词拆分问题(动态规划系列第十六篇)

今日主要总结一下动态规划完全背包的一道题目,139. 单词拆分 题目:139. 单词拆分 Leetcode题目地址 题目描述: 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:…