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

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现

  • 1、乐观锁,悲观锁的区别
  • 2、总结


💖The Begin💖点点关注,收藏不迷路💖

1、乐观锁,悲观锁的区别

  1. 悲观锁(Pessimistic Lock)

    定义: 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞挂起直到它拿到锁

    实现: 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在做操作之前先上锁

    特点: 适用于写操作频繁的场景,但可能会降低并发性能,因为上锁会阻塞其他操作的进行。

示例代码(伪代码):

-- 悲观锁示例(以行锁为例)  
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;  -- 对id为1的行加锁
  1. 乐观锁(Optimistic Lock)

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

    实现版本号机制 (如:为数据表增加一个版本号字段,在更新数据时判断版本号是否变化)或者时间戳机制(使用数据的最后更新时间戳,在更新时判断时间戳是否发生变化)是常见的乐观锁实现方式。

    特点: 适用于多读少写的场景,可以提高系统的整体吞吐量。但如果冲突频繁,上层应用会不断重试,降低性能。

示例代码(伪代码):

-- 乐观锁示例(以版本号为例)  
UPDATE table_name SET column1 = value1, version = version + 1 WHERE id = 1 AND versio

old_version 是之前读取到的版本号,如果更新操作影响的行数为0,则表示在此期间有其他事务已经修改了数据,需要重试。

2、总结

选择:

1、根据实际应用场景选择使用悲观锁还是乐观锁。 如果写操作较少,且希望提高系统吞吐量,可以考虑使用乐观锁;

2、如果写操作频繁,且希望减少数据冲突可以考虑使用悲观锁

注意: 在使用乐观锁时,需要合理设置重试次数和重试间隔,避免频繁重试导致性能下降。同时,需要确保在更新数据时能够正确判断数据是否被其他事务修改过。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖
http://www.lryc.cn/news/353004.html

相关文章:

  • 移动端仪表盘,支持更多组件
  • 科技产业园3D探秘:未来科技之城的奇幻之旅
  • 【Python搞定车载自动化测试】——Python基于Pytest框架实现UDS诊断自动化(含Python源码)
  • 探索SPI单线传输模式中时钟线与数据传输的简化
  • 使用FFmpeg推流实现在B站24小时点歌直播
  • 汽车防抱死制动系统ABS的单片机程序Proteus仿真设计
  • IOS开发者证书快捷申请
  • python 火焰检测
  • 栈——顺序存储
  • 军队仓库管理系统|DW-S301系统特点
  • MySQL和MongoDB数据库的区别
  • 类脑计算和量子计算、人工智能的关系
  • Qt5 互动地图,实现无人机地面站效果
  • 【文末附gpt升级方案】TikTok Symphony AI套件:智能视频制作的新篇章
  • 面试回答——有高并发、高性能、高可用系统架构设计实践以及性能调优经验
  • rocketmq初识
  • php 使用phpoffice导出导出excel
  • 安装docker版elasticsearch和kibana
  • 大语言模型的工程技巧(四)——梯度检查点
  • 批量复制文件智能删除已复制,轻松管理文件新体验!让您的文件整理更高效无忧
  • 从零训练yolov8
  • 民国漫画杂志《时代漫画》第14期.PDF
  • maven-依赖管理
  • Java之设计模式
  • 大胆预测:计算机将要回暖
  • 49 序列化和反序列化
  • PS —— 精修图像
  • 哥白尼哨兵系列卫星数据不能下载的解决方法
  • 结构型模式之桥接模式
  • 数据结构--顺序表