分布式锁4 :数据库DB实现分布式锁的悲观锁和乐观锁,unique实现方式

一   方案1 使用悲观锁解决冲突

1.1 使用悲观锁原理

1.1.1 使用悲观锁的原理

1.悲观锁:在select的时候就会加锁,采用先加锁后处理的模式,虽然保证了数据处理的安全性,但也会阻塞其他线程的写操作。在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续 。select ... for update
悲观锁适用于写多读少的场景,因为拿不到锁的线程,会将线程挂起,交出CPU资源,可以把CPU给其他线程使用,提高了CPU的利用率。

1.1.2 使用悲观锁的优缺点

 优点: 1.简单容易理解;2.可以严格保证数据访问的安全;

 缺点:

1.即每次请求都会额外产生加锁的开销且未获取到锁的请求将会阻塞等待锁的获取,在高并发环境下,容易造成大量请求阻塞,影响系统可用性。另外,悲观锁使用不当还可能产生死锁的情况。

2.性能一般。

1.1.3 使用悲观锁的使用行锁&表锁

1.使用悲观锁时,查询条件必须添加索引,成为索引字段,才走行锁。

2.使用悲观锁是,查询条件不加索引,走表锁。

1.1.4 演示案例

1会话A未提交状态

在会话A中:  执行命令:  begin;select *  from db_stock where product_code='1001' for update

会话A:select ... for update   给具体的行数据加上排他锁(product_code加上索引),也即行锁。

会话B :无法对1001进行更新,因为上了行级锁,无法进行更新

2会话A提交状态

会话B:进行了修改

  1.2 操作案例

使用sql语句: select ... for update   给具体的行数据加上排他锁(product_code加上索引),也即行锁。

1.mapper:编写悲观锁语句

2.service:添加事务注解  @Transactional

3.数据表

4.jmeter压力测试

 5.查看效果:成功实现所减数据为0,均正确消费。

1.3 死锁场景模拟

1.表数据

2.A会话

3.B会话

说明:A会话中,先锁住id=1,再锁住id=2;B会话中,先锁住id=2,再锁住id=1;彼此等待获取锁。则会造成死锁

1.4 此方案的优缺点

1.性能问题;2.死锁问题:对多条数据加锁时,加锁顺序要一致;

3.库存操作要统一,一个会话用 select  x for update  一个会话执行select可以进行查询 ,可能存在数据不一致情况。

会话A:进行查询上行锁,处于未commit状态时,会话B进行  select  查询,会话B可以查询出内容。

二  方案2:使用乐观锁解决冲突

2.1 乐观锁原理

乐观锁:采取了更加宽松的加锁机制,大多是基于数据版本( Version )及时间戳来实现。适合于读比较多,不会阻塞读,读取数据时不上锁,更新时检查是否数据已经被更新过,如果是则取消当前更新进行重试。version 或者 时间戳(CAS思想)。

2.2 操作案例

使用数据版本(Version)记录机制实现,这是乐观锁最常用的实现 方式。一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录 的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新。

更新sql:

select * from db_stock where product_code='1001'
update db_stock set count=4996,version=version+1 where id=1 and version=0;

1.修改service

2.数据库表

3.压力测试

4.查看消费结果: 均正确消费

2.3 乐观锁存在的缺点

优点:

优点比较明显,由于在检测数据冲突时并不依赖数据库本身的锁机制,不会影响请求的性能,当产生并发且并发量较小的时候只有少部分请求会失败。

缺点:

1.缺点是需要对表的设计增加额外的字段,增加了数据库的冗余,

2.另外,当应用并发量高的时候,version值在频繁变化,则会导致大量请求失败,影响系统的可用性。

1.高并发情况下,性能比较低下,并发量越小,性能越高。

2.读写情况下,乐观锁不可靠。

三  利用unique唯一键索引实现解决冲突

3.1 原理

可以利用唯一键索引不能重复插入的特点实现。

3.2 流程图

  1. 线程同时获取锁(insert)

  2. 获取成功,执行业务逻辑,执行完成释放锁(delete)

  3. 其他线程等待重试

 3.3 核心代码

3.4  方案的优缺点

  1. 这把锁强依赖数据库的可用性,数据库是一个单点,一旦数据库挂掉,会导致业务系统不可用。

    解决方案:给 锁数据库 搭建主备

  2. 这把锁没有失效时间,一旦解锁操作失败,就会导致锁记录一直在数据库中,其他线程无法再获得到锁。

    解决方案:只要做一个定时任务,每隔一定时间把数据库中的超时数据清理一遍。

  3. 这把锁是非重入的,同一个线程在没有释放锁之前无法再次获得该锁。因为数据中数据已经存在了。

    解决方案:记录获取锁的主机信息和线程信息,如果相同线程要获取锁,直接重入。

  4. 受制于数据库性能,并发能力有限。

    解决方案:无法解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/340646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UVT音乐证书考试时间确定,学习氛围渐浓

美国职业资格与人才管理中心(UVT)音乐证书考试时间正式确定,学习氛围逐渐浓厚。众多热爱音乐的从业者和学生开始积极备考,希望通过这一考试获得音乐领域的宝贵证书。音乐证书被认为是音乐人才展示个人专业水平的重要机会&#xff…

re:从0开始的HTML学习之路 2. HTML的标准结构说明

1. <DOCTYPE html> 文档声明&#xff0c;用于告诉浏览器&#xff0c;当前HTML文档采用的是什么版本。 必须写在当前HTML文档的首行&#xff08;可执行代码的首行&#xff09; HTML4的此标签与HTML5不同。 2. <html lang“en”> 根标签&#xff0c;整个HTML文档中…

虚拟机设置固定IP地址以及访问外网

一、虚拟机固定IP地址设置 1、IP地址查看命令 &#xff08;1&#xff09;ip a [rootlocalhost ~]# ip a • inet 192.168.93.129/24这表示该网络接口&#xff08;ens33&#xff09;被分配了一个IPv4地址是192.168.93.129&#xff0c;并且其子网掩码为 24位&#xff08;即/24…

Java多线程并发篇----第二十六篇

系列文章目录 文章目录 系列文章目录前言一、什么是 Executors 框架?二、什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?三、什么是 Callable 和 Future?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

MySQL---多表等级查询综合练习

创建emp表 CREATE TABLE emp( empno INT(4) NOT NULL COMMENT 员工编号, ename VARCHAR(10) COMMENT 员工名字, job VARCHAR(10) COMMENT 职位, mgr INT(4) COMMENT 上司, hiredate DATE COMMENT 入职时间, sal INT(7) COMMENT 基本工资, comm INT(7) COMMENT 补贴, deptno INT…

大模型理论基础3

模型架构 模型概括 先把语言模型看成黑盒&#xff0c;以便于了解整体功能后拆分成&#xff1a;分词、模型架构 分词 首先要知道&#xff1a;语言模型 p 是建立在词元&#xff08;token&#xff09;序列的上的一个概率分布输出&#xff0c;其中每个词元来自某个词汇表V&#…

解决github无法访问的问题(修改hosts)

1.先ping github.com看是否能ping通 不能ping通的话&#xff0c;找到github最新的ip地址&#xff0c;修改hosts文件&#xff08;C:\Windows\System32\drivers\etc&#xff09; 找最新的ip地址的办法&#xff1a; a.cmd中ping时返回的 b.点击ipaddress.com查询网站链接 修改host…

微信小程序入门,学习全局配置与页面配置

目录 一、微信小程序 二、微信小程序的全局配置 三、微信小程序的页面配置 四、全局配置与页面配置的区别 一、微信小程序 微信小程序是一种基于微信平台的应用程序&#xff0c;它可以在微信内部直接运行&#xff0c;无需下载安装。微信小程序具有以下特点和优势&#xff…

数据结构与算法:图

文章目录 图1) 概念有向 vs 无向度权路径环图的连通性 2) 图的表示3) Java 表示4) DFS5) BFS6) 拓扑排序7) 最短路径DijkstraBellman-FordFloyd-Warshall 8) 最小生成树PrimKruskal 图 1) 概念 图是由顶点&#xff08;vertex&#xff09;和边&#xff08;edge&#xff09;组成…

前后端分离,使用vue3整合SpringSecurity加JWT实现登录校验

前段时间写了一篇spring security的详细入门&#xff0c;但是没有联系实际。 所以这次在真实的项目中来演示一下怎样使用springsecurity来实现我们最常用的登录校验。本次演示使用现在市面上最常见的开发方式&#xff0c;前后端分离开发。前端使用vue3进行构建&#xff0c;用到…

vue生命周期图示

详见&#xff1a;官网介绍

梳理一下若依框架的权限过滤系统

梳理一下若依框架的权限过滤系统 首先&#xff0c;我们直入主题&#xff0c;且看这段代码 /*** 获取用户列表*/ PreAuthorize("ss.hasPermi(system:user:list)") GetMapping("/list") public TableDataInfo list(SysUser user) {startPage();List<SysU…

OpenHarmony当前进展和未来趋势

操作系统自20世纪50年代诞生&#xff0c;经历了从专用操作系统到通用操作系统的转变。整体可以将操作系统的发展历史分为3个阶段&#xff1a;PC时代、移动互联网时代、万物互联时代。 PC时代主要以计算机为主&#xff0c;用户规模从1970年的10亿增长到1990年的30亿。这一时代诞…

QComboBox 下拉框

文章目录 1、简介2、functions3、Signal QT 官方文档参考地址&#xff1a;https://doc.qt.io/qt-5/qcombobox.html 1、简介 QComboBox 是下拉列表框组件类&#xff0c;它提供一个下拉列表供用户选择&#xff0c;也可以直接当作一个 QLineEdit 用作输入。 2、functions 1、voi…

供应商导添加预扣税字段

文章目录 1 Introduction2 Code3 Summary 1 Introduction I only think I can assign value to them and I implement it by the following code . 2 Code LOOP AT gt_bukrs INTO gs_bukrs WHERE lifnr gs_alv1-lifnr.CLEAR:ls_company.ls_company-task M.ls_company-data…

mybatis----动态Sql

1.if标签 通过if标签构建动态条件&#xff0c;通过其test属性的true或false来判断该添加语句是否执行。 mapper接口 public interface AccountMapper {List<Account> selectAllByCondition(Account account); } 映射文件 <select id"selectAllByCondition&q…

具有运动模糊的大规模场景的混合神经绘制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;具有运动模糊的大规模场景的混合神经绘制1、研究背景2、方法提出3、视点依赖归一化方法4、训练方法5、试验细节及对比 YOLO模型1、…

.NET高速开发分层架构,ASPNETCore,IOC开发

分层架构,ASPNETCore,IOC开发 大家好,我是行不更名,坐不改姓的宋晓刚。今天我将带领大家深入了解分层架构、ASP.NET Core、IoC 开发,以及共同开发的魅力。我们将一同探索如何利用这些先进技术构建高效、可维护的数据库应用程序。 家人们,如果有什么不懂,可以留言,或者…

【JS逆向学习】国家加密系列-SM算法实例

SM系列 1、国家加密算法介绍 事实上从 2010 年开始&#xff0c;我国国家密码管理局就已经开始陆续发布了一系列国产加密算法&#xff0c;其中SM1、SM4、SM7、祖冲之密码&#xff08;ZUC&#xff09;是对称算法&#xff1b;SM2、SM9是非对称算法&#xff1b;SM3是哈希算法。目…

大数据导论(4)---大数据应用

文章目录 1. 在互联网中的应用1.1 推荐系统1.2 长尾理论1.3 推荐方法与模型1.4 推荐系统应用 2. 在其他领域的应用2.1 企业营销2.2 智慧交通 1. 在互联网中的应用 1.1 推荐系统 1. 推荐系统产生&#xff1a;  (1) 互联网的飞速发展使我们进入了信息过载的时代&#xff0c;搜索…