MySQL 乐观锁 简例

2023-05-16

乐观锁与悲观锁不同的是,它是一种逻辑上的锁,而不需要数据库提供锁机制来支持

当数据很重要,回滚或重试一次需要很大的开销时,需要保证操作的ACID性质,此时应该采用悲观锁

而当数据对即时的一致性要求不高,重试一次不太影响整体性能时,可以采用乐观锁来保证最终一致性,同时有利于提高并发性

通常,乐观锁采用版本号/时间戳的形式实现:给数据额外增加一个版本号字段进行控制;更新时,若提交的数据所带的版本号与当前记录的版本号一致,则允许变更执行并更新版本号;若不一致,则意味着产生冲突,根据业务需求直接丢弃并返回失败,或者尝试合并

在MySQL的实践中,常见的一种使用乐观锁的方法,是在需要使用乐观锁的表中,新增一个version字段

例如:

create table product_amount (

id int not null primary key auto_increment,

product_name varchar(64) not null,

selling_amount int not null,

storing_amount int not null,

version int not null

);

当需要更新销售中的商品数量(selling_amount)时,使用如下的SQL语句:

update product_amount set selling_amount = #{selling_amount}, version = #{new_version} where id=#{id} and version = #{old_version};

若该语句返回1,则表示更新成功;若返回0,则表示前后的version不一致,产生冲突,更新失败

对于更新仓库中的商品数据(storing_amount)时,也是同理

不过,这样为每行记录都统一设置一个version字段的乐观锁方式,存在一个问题:上例中,如果同时需要单独对selling_amount及storing_amount进行update(两条SQL语句分别单独执行),那么后执行的一条会因为先执行的一条更新了version字段而失败,而这种失败显然是没有必要的,白白浪费了开销

一种比较好的方式是为每个需要乐观锁的字段单独设置版本号,例如对上例的改造:

create table product_amount (

id int not null primary key auto_increment,

product_name varchar(64) not null,

selling_amount int not null,

selling_version int not null,

storing_amount int not null,

storing_version int not null

);

selling_amount和storing_amount分别拥有自己的乐观锁版本号(selling_version和storing_version),更新时分别只关注自己的版本号,这样就不会因为版本号被其它字段修改而失败,提高了并发性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 乐观锁 简例 的相关文章

  • Android:Json 无法从 mysql 数据库检索任何文件,它是空的

    我是 android 新手 我正在使用 mysql 数据库 其中我链接 php 文件进行连接 工作正常 但我的代码没有显示任何内容 它只显示背景色黑色 而不是显示数据库中的数据 public class HomeFragment exten
  • Laravel updateOrCreate 带有自动增量数据库

    我的目的是如果值存在则更新 否则插入新行提交表单后在数据库表中 问题是 这里的函数添加新列在数据库表中而不是更新它们 这是我的功能 MyModel updateOrCreate array myField gt myValue gt whe
  • 如何通过python将python字典存储到mysql数据库中

    我试图通过将字典转换为字符串然后尝试插入来将以下字典存储到 mysql DB 中 但出现以下错误 如何解决这个问题 或者有其他方法将字典存储到 mysql DB 中吗 dic office component office Word2010
  • 使用 php 执行 *.sql 文件

    我需要执行一个 sql 文件 其中大约有 48 个要创建的表 它由注释和以 结尾的sql命令组成 有没有办法运行这些 sql 命令 将它们立即转换为单个字符串 我的意思是我需要使用 php 立即运行整个文件 我可以使用 mysql quer
  • postgresql中插入语句中的加密密码抛出错误(需要添加显式类型转换)

    刚接触 postgresql 这可能很简单 但我不明白 我在 mysql 中有这个 insert into APP USERS VALUES 1 admin adminemailid System Administrator SysAdmi
  • 无法打开 mysql-workbench

    我开始使用 mysql 但无法打开 mysql workbench 当我尝试通过 ubuntu 命令行打开它时 出现以下错误 usr lib mysql workbench mysql workbench bin 符号查找错误 usr li
  • Codeigniter 活动记录选择、左连接、计数

    我有一个显示数据库查询结果的表单 这些结果可以有许多其他资产与之相连 我想找到一种方法来显示每个元素有多少资产 例如 我的表是英格兰地区 另一个表是用户居住的地方 我当前有这个代码 this gt db gt select this gt
  • 缺少 /var/lib/mysql/mysql.sock 文件

    我正在尝试访问 mysql 当我运行 mysql 命令时 我得到以下信息 root ip 10 229 65 166 tpdatabase 1 8 0 28356 mysql 错误 2002 HY000 无法连接到 通过socket本地My
  • 在列名中使用保留字

    这是一些简单的代码 但我只是不知道为什么我不能使用这个词作为表的实体 CREATE TABLE IF NOT EXISTS users key INT PRIMARY KEY NOT NULL AUTO INCREMENT username
  • mysql非空字段计数

    我想计算 mysql 中特定字段集有多少字段为空 我找到了一些示例 但它们都遍历整个表 基本上我有8个字段 listing photo 1 到listing photo 8 我想知道其中有多少个被填充 I tried result mysq
  • mysql连接3个表

    如何连接三个具有一个公共列 id 的mysql表 例如 从表1中选择a b 从表2中选择c d 从表3中选择e f 其中id x 谢谢 SELECT t1 a t1 b t2 c t2 d t3 e t3 f FROM table1 t1
  • 初学者 MYSQL 错误 - 访问被拒绝

    错误 1045 28000 用户 root localhost 的访问被拒绝 使用密码 N 哦 我已经尝试了一切 我已经阅读了一页又一页的答案 但似乎没有人知道正确的答案 当我尝试登录我的数据库时 我只是收到上述错误 我还没有设置密码或其他
  • 基于 MySQL 中的另一列创建计算列

    我的表中有 2 列 varchar 8 and an int 我想要auto increment the int column当我这样做时 我想将值复制到varchar 8 column 但用 0 填充它直到它达到 8 个字符长 因此例如
  • 如何在mySQL数据库中安全地插入代码

    我正在构建一个网站 用户可以使用 PHP 和 mySQL 数据库来存储代码片段 但我不知道如何安全地将用户输入的代码插入我的数据库 我无法使用我通常使用的 安全 功能来转换输入 trim stripslashes等 因为重点是您可以将代码视
  • MySQL 编码问题 - 从 Windows 到 Linux 结果不同

    我有一个托管在 Windows 服务器上的 MySQL 数据库 当我使用 mysql 控制台从各种 Windows 机器查询特定记录时 我得到P ivi 不正确 当我使用 mysql 控制台从不同的 nix 机器查询相同的记录时 我得到P
  • 使用存储的日期字段来计算计算当前过去天数的字段

    我正在使用 MySQL 和 phpMyAdmin 我的数据库中有一个 日期 字段 我需要在 MySQL db 中创建一个字段 该字段将计算并显示自每个记录 行的 日期 字段中的日期以来已经过去的天数 我没有能力使用 PHP 即时生成代码 有
  • Mysql乘法查询

    我有一个名为 产品 的表 其中包含一个名为 价格 的字段 我只想将每种产品的价格加倍 请您帮我提供一条可以在 PHP myAdmin 中运行的 SQL 语句 update products set price price 2
  • ? LIKE(列 || '%')

    我可以有这样的条件吗 SELECT FROM table WHERE LIKE column 哪里的 是一个字符串参数值 例如 这些参数值 当列等于时应返回 true admin products admin products 1 admi
  • 我可以在 MySQL 中存储图像吗?

    这个问题在这里已经有答案了 可能的重复 MySQL 中的图像 https stackoverflow com questions 1665730 images in mysql 在 MySQL 中存储图像 https stackoverfl
  • 为什么呼叫会话不起作用? (代码点火器 3)

    我的配置是这样的 config sess driver database select database driver config sess save path ci sessions name of the mysql table co

随机推荐

  • WIFI模块接入ONENET步骤

    文章目录 前言思维导图一 onenet c文件1 产品IDONENET程序 2 鉴权信息ONENET程序 3 设备IDONENET程序 二 esp8266 c文件1 WIFI名称及密码程序 2 IP及端口 三 打包数据函数 在onenet
  • K8S 控制器 service ingress

    控制器 Pod 的分类 自主式 Pod xff1a Pod 退出后不会被创建 控制器管理的 Pod xff1a 在控制器的生命周期里 xff0c 始终要维持 Pod 的副本数目 控制器类型 Replication Controller和Re
  • K8s---网络通信 Configmap secrer volumesk8s

    k8s网络通信简介 k8s通过CNI接口接入其他插件来实现网络通讯 目前比较流行的插件有flannel xff0c calico等 CNI插件存放位置 xff1a cat etc cni net d 10 flannel conflist
  • Linux进程管理动态查看进程top

    目录 一 解读top命令的显示信息 1 上半部分解读 xff08 前五行 xff09 2 后半部分 xff08 进程信息 xff09 二 top常用内部指令 一 解读top命令的显示信息 命令 xff1a top 注意 xff1a 在top
  • ENSP基本命令和小实验

    ENSP基本命令和小实验 ENSP基本命令1 历史命令查询2 配置主机名3 状态信息查询4 进入接口模式并查看信息5 配置文件管理命令6 关闭华为的信息提示中心7 永不超时8 配置双工及速率命令9 保存配置10 用SecureCRT链接eN
  • 一个刚毕业大学生的四个月苦逼程序员经历

    先来一个自我介绍 大学时排名老三 就暂且叫老三吧 xff0c 毕业于河南的一个还算可以的二本院校 xff0c 专业 地球信息科学与技术 首先介绍一下我的专业 xff0c 听着名字很高大上 xff0c 其实 xff0c 我们都叫他四不像专业
  • windows10系统下基于pybind11库进行c++代码调用python(pytorch)代码

    最近在学习基于lidar mos进行slam激光点云动态物体剔除的相关内容 xff0c 经过调研准备基于pybind11库在实际项目 c 43 43 中调用salsaNext代码 python 使用cmake在测试项目中引入pybind11
  • 事件流是什么

    事件流分为事件冒泡和事件捕获 事件流 xff1a 就是事件的流向 xff0c 先捕获 xff0c 再到事件源 xff0c 最后再冒泡 xff0c 一共分三个阶段 xff1a 捕获阶段 xff0c 事件源 xff0c 冒泡阶段 从上至下再出来
  • 实现浏览器访问基于workman的异步任务

    准备工作 xff1a 安装workman xff0c 引入 目录 xff1a 进程任务服务端service php 提交任务服务端service transit php index php cli模式开启service php和servic
  • socket套接字编程---UDP通信流程和代码编写

    文章目录 1 UDP通信流程和接口介绍1 1UDP通信流程 xff1a 1 2接口介绍 xff1a 1 2 1创建套接字1 2 2为套接字绑定地址信息1 2 3发送数据1 2 4接收数据1 2 5 关闭套接字 释放资源 2 UDP通信代码实
  • 关于嵌入式高级项目小组的规划(初稿)

    关于嵌入式高级项目小组的规划 xff08 初稿 xff09 一 想法初衷 大家好 xff0c 我是一个嵌入式爱好者 虽然不是电子专业 xff0c 也不是软件这些相关的专业 xff0c 但我就是感兴趣 xff0c 从做8位单片机实验到现在自学
  • 嵌入式算法11---矩阵转置与压缩

    在整个物联网系统中 xff0c 嵌入式设备作为数据采集 过滤 缓存 传输的节点 xff0c 前面系列文章分别介绍了嵌入式设备相关的各种数据过滤 校验和压缩存储算法 缓存和传输阶段 xff0c 考虑到嵌入式设备的存储空间和传输带宽限制 xff
  • win10下安装Ubuntu16.04双系统

    win10下安装Ubuntu16 04双系统 最近由于想体验一下Ubuntu系统 xff0c 由于虚拟机的体验不是很好 xff0c 所以便在电脑上试下装双系统 自己也是一步步按着网上的帖子来 xff0c 由于网上的教程都不是最新的而且有的也
  • 【Vue入门实践3】不调后端接口==>el-table单纯前端实现查询和重置功能==>【el-table组件使用】表格静态前端筛选、查询重置功能

    一个人的心理健康程度与接纳痛苦的程度成正比 感谢自己的不完美 目录 一 功能效果描述 二 el table自带筛选功能 三 前端假查询重置功能 1 el form表单 2 el table表格数据 3 search功能 4 reset重置功
  • 控制理论简要介绍

    文章目录 鲁棒控制自适应控制滑膜控制 xff08 变结构控制 xff09 模型预测控制 MPC RBF神经网络 xff08 单隐层神经网络 xff09 xff1a 模糊控制 鲁棒控制 xff08 H无穷 H2 混合控制和LMI控制 xff0
  • ConcurrentHashMap、synchronized与线程安全

    最近做的项目中遇到一个问题 xff1a 明明用了ConcurrentHashMap xff0c 可是始终线程不安全 除去项目中的业务逻辑 xff0c 简化后的代码如下 xff1a public class Test40 public sta
  • Spring MVC集成slf4j-logback

    1 Spring MVC集成slf4j log4j 关于slf4j和log4j的相关介绍和用法 xff0c 网上有很多文章可供参考 xff0c 但是关于logback的 xff0c 尤其是Spring MVC集成logback的 xff0c
  • Spring Bean 创建过程

    0 通常 xff0c 无论是DispatcherServlet ContextLoaderListener还是ClassPathXmlApplicationContext xff0c 首次实例化bean的入口并不是在每次调用getBean的
  • MySQL DataSource 性能对比(2015-8-19)

    1 本地性能测试耗时 xff08 一 xff09 共同条件 xff1a 测试程序与数据库在同一台主机上 xff0c 各DataSource均采用默认配置 xff0c 每个线程循环1000次 xff0c 查询语句为select from ta
  • MySQL 乐观锁 简例

    乐观锁与悲观锁不同的是 xff0c 它是一种逻辑上的锁 xff0c 而不需要数据库提供锁机制来支持 当数据很重要 xff0c 回滚或重试一次需要很大的开销时 xff0c 需要保证操作的ACID性质 xff0c 此时应该采用悲观锁 而当数据对