mysql如何使用乐观锁_mysql 乐观锁实现

mysql如何使用乐观锁_mysql 乐观锁实现一 为什么需要锁 并发控制 在多用户环境中 在同一时间可能会有多个用户更新相同的记录 这会产生冲突 这就是著名的并发性问题 典型的冲突有 1 丢失更新 一个事务的更新覆盖了其它事务的更新结果 就是所谓的更新丢失 例如 用户 A 把值从 6 改为 2 用户 B 把值从 2 改为 6 则用户 A 丢失了他的更新 2 脏读 当一个事务读取其它完成一半事务的记录时 就会发生脏读取 例如 用户 A B 看到的值都是 6 用户 B 把值改为

一、为什么需要锁(并发控制)?

在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。

典型的冲突有:

1.丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失。例如:用户A把值从6改为2,用户B把值从2改为6,则用户A丢失了他的更新。

2.脏读:当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。

为了解决这些并发带来的问题。 我们需要引入并发控制机制。

二、 并发控制机制

锁,即给我们选定的目标数据上锁,使其无法被其他程序修改。

1.悲观锁:指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态

2.乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。

三、乐观锁的实现

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

1.数据库表设计

task

有三个字段,分别是id,value、version

2.实现

1)先读task表的数据(实际上这个表只有一条记录),得到version的值为versionValue

2)每次更新task表中的value字段时,为了防止发生冲突,需要这样操作

update task set value = newValue,version =  versionValue + 1   where version = versionValue;

只有这条语句执行了,才表明本次更新value字段的值成功

如假设有两个节点A和B都要更新task表中的value字段值,差不多在同一时刻,A节点和B节点从task表中读到的version值为2,那么A节点和B节点在更新value字段值的时候,都操作 update task set value = newValue,version =  3   where version = 2;,实际上只有1个节点执行该SQL语句成功,假设A节点执行成功,那么此时task表的version字段的值是3,B节点再操作update task set value = newValue,version =  3   where version = 2;这条SQL语句是不执行的,这样就保证了更新task表时不发生冲突

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177013.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午8:31
下一篇 2026年3月26日 下午8:31


相关推荐

  • 虚拟存储器中页面置换算法的实现课程设计_段页式存储管理方式的内存地址为

    虚拟存储器中页面置换算法的实现课程设计_段页式存储管理方式的内存地址为设计目的 通过请求页式存储管理中页面置换算法模拟程序,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。 设计内容 阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。模拟实现页式虚拟存储管理的三种页面置换算法(OPT、FIFO和LRU),并通过比较性能得出结论。前提:(1)页面分配采用固定分配局部置换。(2)作业的页面走向…

    2026年4月14日
    5
  • {{userData.name}}已认证

    {{userData.name}}已认证

    2026年3月15日
    2
  • AI大模型教程来了(大模型从入门到实战)AI大模型颠覆时代!带你从0到精通,高薪就业不是梦!

    AI大模型教程来了(大模型从入门到实战)AI大模型颠覆时代!带你从0到精通,高薪就业不是梦!

    2026年3月13日
    4
  • Parquet与ORC:高性能列式存储格式

    Parquet与ORC:高性能列式存储格式背景随着大数据时代的到来 越来越多的数据流向了 Hadoop 生态圈 同时对于能够快速的从 TB 甚至 PB 级别的数据中获取有价值的数据对于一个产品和公司来说更加重要 在 Hadoop 生态圈的快速发展过程中 涌现了一批开源的数据分析引擎 例如 Hive SparkSQL Impala Presto 等 同时也产生了多个高性能的列式存储格式 例如 RCFile ORC Parquet 等 本文主要从实现的角度上对比分析

    2026年3月17日
    2
  • android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」

    android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」Retrofit,OkHttp,Okio是Square团队开源的安卓平台网络层三板斧,它们逐层分工,非常优雅地解决我们对网络请求甚至更广泛的I/O操作的需求。其中最底层的Okio堪称小而美,功能也更基础,应用更广泛。这次我们就对它进行一个详细的分析。本文的分析基于Okio截至2016.8.4的最新源码,非常建议大家下载Okio源码之后,跟着本文,过一遍源码。1,概览和分析…

    2022年5月30日
    36
  • 利用 USB转485通过Wireshark抓取MSTP数据

    利用 USB转485通过Wireshark抓取MSTP数据1.准备USB转485的硬件设备,将+连到MSTP通讯的+,一连到MSTP的-.USB头插到PC上2.下载wireshark,然后一路安装到底。安装完wireshark后,到https://sourceforge.net/projects/bacnet/files/bacnet-tools/下载BACnet新版的tools,下载好后解压找到mstpcap.exe拷贝到wireshark安装目录中的extcap中。3.打开wireshark软件,插好USB转485工具。按下图找到BACne..

    2022年5月23日
    72

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号