当前位置: 首页 > news >正文

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

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

1.1 使用悲观锁原理

1.1.1 使用悲观锁的原理

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

1.1.2 使用悲观锁的优缺点

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

 缺点:

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

2.性能一般。

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

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

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

5.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:使用乐观锁解决冲突

相关文章:

  • Spring、Spring-MVC、Mybatis、Mybatis-generator整合核心配置文件记录
  • 如何发布自己的npm包
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • 大数据技术原理及应用课实验4: NoSQL和关系数据库的操作比较
  • Java leetcode简单刷题记录3
  • 【Linux 内核源码分析】堆内存管理
  • Glass Scienttan
  • 题记(22)--计算表达式
  • Unity中实现捏脸系统
  • HCIA-HarmonyOS设备开发认证-HarmonyOS简介
  • 大模型学习之书生·浦语大模型6——基于OpenCompass大模型评测
  • 安卓Spinner文字看不清
  • 基于yolov5-master和pyqt5的森林火灾监测软件
  • Webpack5入门到原理2:基本使用
  • System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误
  • php的引用
  • [译]前端离线指南(上)
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Android 架构优化~MVP 架构改造
  • JavaScript设计模式与开发实践系列之策略模式
  • Js基础——数据类型之Null和Undefined
  • LintCode 31. partitionArray 数组划分
  • SpiderData 2019年2月13日 DApp数据排行榜
  • spring-boot List转Page
  • 第十八天-企业应用架构模式-基本模式
  • 如何实现 font-size 的响应式
  • 手机端车牌号码键盘的vue组件
  • 学习JavaScript数据结构与算法 — 树
  • postgresql行列转换函数
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #Linux(权限管理)
  • #QT(智能家居界面-界面切换)
  • (C语言)共用体union的用法举例
  • (done) 两个矩阵 “相似” 是什么意思?
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (利用IDEA+Maven)定制属于自己的jar包
  • (算法二)滑动窗口
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET Framework .NET Core与 .NET 的区别
  • .NET MVC之AOP
  • .NET基础篇——反射的奥妙
  • .NET连接数据库方式
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • /bin/rm: 参数列表过长"的解决办法
  • @EnableAsync和@Async开始异步任务支持
  • @SpringBootApplication 包含的三个注解及其含义
  • [ NOI 2001 ] 食物链
  • [android] 练习PopupWindow实现对话框
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [Geek Challenge 2023] web题解
  • [linux] GFLOPS和TFLOPS的换算