码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【面试干货】数据库乐观锁,悲观锁的区别,怎么实现


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

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


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

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

    1. 悲观锁(Pessimistic Lock)

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

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

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

    示例代码(伪代码):

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

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

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

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

    示例代码(伪代码):

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

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

    2、总结

    选择:

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

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

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

    在这里插入图片描述


    💖The End💖点点关注,收藏不迷路💖
  • 相关阅读:
    65w 字!阿里分布式开发小册 Github 新开源!原理实践双飞
    KeyarchOS的CentOS迁移实践:使用操作系统迁移工具X2Keyarch V2.0
    [AUTOSAR][诊断管理][ECU][$22] 读取相关的数据
    【vue】在vue项目中按顺序动态24个英文字母选项:A B C D E F......
    java指令重排序
    JS对象操作(in、instanceof、delete)运算符
    Jmeter——性能测试的认知以及思考bug(一)
    【轮式平衡机器人】——TMS320F28069片内外设之ePWM
    C++ 新特性 | C++ 11 | lambda表达式
    CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点
  • 原文地址:https://blog.csdn.net/qq_41840843/article/details/139204144
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号