【乐观锁与悲观锁】—— 每天一点小知识

在这里插入图片描述

                                                                              💧 乐观锁与悲观锁 \color{#FF1493}{乐观锁与悲观锁} 乐观锁与悲观锁💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

    • 🌊一、乐观锁简介
    • 🌊二、悲观锁简介
    • 🌊三、乐观锁和悲观锁的优缺点
      • 乐观锁的优点
      • 乐观锁的缺点
      • 悲观锁的优点
      • 悲观锁的缺点
    • 🌊四、适用场景
  • 🐳结语


🌊一、乐观锁简介

    💧乐观锁是一种并发控制策略,它假设多个事务在执行期间不会发生冲突。当一个事务读取数据时,它会检查该数据的版本号是否与自己的版本号一致。如果一致,则认为该数据未被其他事务修改过,可以安全地进行更新操作;否则,认为该数据已被其他事务修改过,需要重新获取最新版本号并重试更新操作。

🌊二、悲观锁简介

    💧悲观锁也是一种并发控制策略,它假设多个事务在执行期间会发生冲突。当一个事务读取数据时,它会先对该数据行加锁,防止其他事务修改该数据行。当一个事务完成对数据的更新操作后,会释放锁资源,其他事务才能继续访问该数据行。

🌊三、乐观锁和悲观锁的优缺点

乐观锁的优点

  • 不需要额外的存储空间来记录锁定信息。
  • 可以减少死锁的可能性。
  • 可以提高并发性能

乐观锁的缺点

  • 可能存在“脏读”问题。因为其他事务可能已经修改了数据,但是由于版本号不一致,当前事务仍然认为数据是未修改状态。

脏读(Dirty Read)是数据库中事务隔离级别的一种现象,它发生在一个事务读取了另一个事务未提交的数据。换句话说,当一个事务正在修改数据时,另一个事务可以读取到未提交的数据,这样可能导致读取到的数据是不一致或无效的。脏读可以导致数据的不一致性。

  • 可能存在“不可重复读”问题。因为其他事务可能在当前事务读取数据之前就已经修改了数据,导致当前事务读取到的数据不是最新的。

不可重复读(Non-repeatable Read)也是数据库中事务隔离级别的一种现象,它发生在一个事务内多次读取同一数据,但每次读取得到的结果不一致。这种现象可以出现在以下情况:当一个事务读取了某个数据,然后另一个事务修改了该数据并提交,导致第一个事务再次读取时得到了不同的结果。这种情况下,事务无法重复读取相同的数据,因为数据已经发生了变化。

  • 可能存在“幻读”问题。因为其他事务可能在当前事务读取数据之后插入了新的数据行,导致当前事务查询到的结果集发生变化。

幻读(Phantom Read)也是数据库中事务隔离级别的一种现象,它发生在一个事务内多次执行相同的查询,但每次查询得到的结果集不同。幻读通常发生在并发环境下,当一个事务在读取某个范围内的数据时,另一个事务在该范围内插入了新的数据并提交,导致第一个事务再次读取时发现新增了一些数据。这种情况下,事务感觉到发生了"幻觉",好像数据出现了新增的"幻影"。

悲观锁的优点

  • 可以保证数据的一致性。
  • 可以避免“脏读”、“不可重复读”和“幻读”等问题。

悲观锁的缺点

  • 需要额外的存储空间来记录锁定信息。
  • 可能降低并发性能。
  • 如果多个事务同时访问同一数据行,可能会出现死锁问题。

🌊四、适用场景

乐观锁适用于读多写少的场景↓

    💧因为在这种情况下,多个事务同时访问同一数据行的可能性较小,而且不需要保证数据的一致性。

悲观锁适用于读写都比较频繁的场景↓

    💧因为在这种情况下,需要保证数据的一致性,而且需要避免死锁问题。

在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构之静态链表

定义 用两个数组实现链表,一个数组存储数据,另一个数组记录当前数据的后继的下标。 示例 数据:data[] {-1, 34, 28, 53, 16, 25, -1, -1, -1, -1} 后继:next[] { 1, 2, 3, 4, 5, -1, -1, -1, -1, -1} 说明 -1: 表示无效值 …

CentOS7下载并安装mysql-8.0.33

CentOS7下载并安装mysql-8.0.33 一、官网下载mysql-8.0.33 MySQL下载路径 MySQL :: Download MySQL Community Server 自己百度mysql官网下载的话直接按照完整路径指示下载即可,如果点击上面的连接下载mysql的话,直接按照4、5、6步骤选择适合自己linu…

Canny边缘检测

Canny边缘检测 步骤: 使用高斯滤波器,以平滑图像,滤波噪声计算图像中每个像素点的梯度强度和方向应用非极大值抑制(Non-Maximum Suppression),以消除边缘检测带来的杂散响应应用双阈值(Double…

视频融合平台EasyCVR电子地图增加鼠标悬停展示经纬度

EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可…

MFC第九天 CRect类的封装和窗口坐标系转换及获取窗口ID 以及对CTime类与COleDateTime类简介

文章目录 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介CRect类的封装窗口坐标系转换及获取窗口IDCTime类与COleDateTime类简介关于设置日期控件上的时间问题 CRect类的封装、窗口坐标系转换及获取窗口ID 、CTime类与COleDateTime类简介 CRect类的…

<Oracle>《Linux 下安装Oracle数据库 - Oracle 19C By CentOS 8 》(第一部分)

《Linux 下安装Oracle数据库 - Oracle 19C By CentOS 8 》(第一部分) 1 说明1.1 前言1.2 资源下载 2 安装步骤2.1 上传安装包2.2 下载数据库预安装包2.3 安装数据库预安装包 1 说明 1.1 前言 本文是Linux系统命令行模式安装Oracle数据库的学习实验记录…

ansible自动化IT工具安装部署与使用验证

目录 一、环境配置 1、关闭防火墙 2、免密登录配置 3、同步时区 二、服务端配置 1、安装软件 2、查看版本 3、实现远程控制huyang3 4、测试 结果验证: 一、环境配置 1、关闭防火墙 systemctl stop firewalld iptables -F setenforce0 2、免密登录配置 【huy…

AI日报:DragGAN通过拖拽像素点实现图像调整 等

🦉 AI新闻 🚀 DragGAN:一种直观的图像编辑工具,通过拖拽像素点实现图像调整 摘要:研究者们来自马克斯・普朗克计算机科学研究所、MIT CSAIL和谷歌,他们开发了一种名为DragGAN的图像编辑工具。通过拖拽像素…

SAM与Prompt的结合

1. SAM介绍 由Meta AI Research开发的Segment anything model(简称SAM)最近引起了广泛的关注。SAM在超过10亿个mask的大型分割数据集上进行了训练,能够在特定的图像上分割任何对象。在最初的SAM工作中,作者们使用了零样本迁移任务…

Nacos(一):简介 如何安装 服务注册与发现 集群 权重 与Eureka区别

一、简介 1、应用场景 当服务调用越来越多,服务的地址需要管理起来,并实现动态调用而不是硬编码在接口中。此时需要一个注册中心来帮助我们管理服务。 流程如下: 商品微服务注册IP和端口到注册中心订单微服务先从注册中心获取到商品微服务…

从0开始,精通Go语言Rest微服务架构和开发

说在前面 现在拿到offer超级难,甚至连面试电话,一个都搞不到。 尼恩的技术社区中(50),很多小伙伴凭借 “左手云原生右手大数据”的绝活,拿到了offer,并且是非常优质的offer,据说年…

1σ Random Jitter of SSB for TIE Period

1σ Random Jitter of SSB for TIE & Period ,该章节厘清了jitter基本概念,并给出了对应的表达式。