Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
mysql乐观锁是什么?_创想鸟

mysql乐观锁是什么?

mysql乐观锁是相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

mysql乐观锁是什么?

mysql乐观锁是( Optimistic Locking )相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。

那么我们如何实现乐观锁呢,一般来说有以下2种方式:

1、使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现 方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。

当我们提交更新的时候,判断数据库表对应记录 的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数 据。用下面的一张图来说明:

094a51dd892066bc28da725ac1d07d6.png

如上图所示,如果更新操作顺序执行,则数据的版本(version)依次递增,不会产生冲突。但是如果发生有不同的业务操作对同一版本的数据进行修 改,那么,先提交的操作(图中B)会把数据version更新为2,当A在B之后提交更新时发现数据的version已经被修改了,那么A的更新操作会失败。

 

2、乐观锁定的第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳 (timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

相关学习推荐:mysql视频教程

使用举例:

以MySQL InnoDB为例

还是拿之前的实例来举:商品goods表中有一个字段status,status为1代表商品未被下单,status为2代表商品已经被下单,那么我们对某个商品下单时必须确保该商品status为1。假设商品的id为1。

下单操作包括3步骤:

1、查询出商品信息

select (status,status,version) from t_goods where id=#{id}

2、根据商品信息生成订单

牛NIUCMS本地O2O系统 牛NIUCMS本地O2O系统

牛NIUCMS本地O2O系统是一个以php+mysql进行开发的o2o网站系统。NIUCMS是一款强大的网站管理系统。支持智慧城市、智慧小区、智慧乡村、本地生活门户、本地O2O平台的构建。请注意以下几点:1、这套源码必须要服务器支持伪静态,是支持.htaccess规则的伪静态,一般Apache服务器支持,别搞的下载回去以后说什么缺 少文件,其实源码并非缺少文件。2、这套源码请在php 5.4环境下

牛NIUCMS本地O2O系统 0 查看详情 牛NIUCMS本地O2O系统

3、修改商品status为2

update t_goods set status=2,version=version+1where id=#{id} and version=#{version};

 

那么为了使用乐观锁,我们首先修改t_goods表,增加一个version字段,数据默认version值为1。

t_goods表初始数据如下:

mysql> select * from t_goods;  +----+--------+------+---------+  | id | status | name | version |  +----+--------+------+---------+  |  1 |      1 | 道具 |       1 |  |  2 |      2 | 装备 |       2 |  +----+--------+------+---------+  2 rows in set    mysql>

对于乐观锁的实现,我使用MyBatis来进行实践,具体如下:

Goods实体类:

/**  * ClassName: Goods 
* Function: 商品实体.
* date: 2013-5-8 上午09:16:19
* @author chenzhou1025@126.com */ public class Goods implements Serializable { /** * serialVersionUID:序列化ID. */ private static final long serialVersionUID = 6803791908148880587L; /** * id:主键id. */ private int id; /** * status:商品状态:1未下单、2已下单. */ private int status; /** * name:商品名称. */ private String name; /** * version:商品数据版本号. */ private int version; @Override public String toString(){ return "good id:"+id+",goods status:"+status+",goods name:"+name+",goods version:"+version; } //setter and getter }

GoodsDao

/**  * updateGoodsUseCAS:使用CAS(Compare and set)更新商品信息. 
* * @author chenzhou1025@126.com * @param goods 商品对象 * @return 影响的行数 */ int updateGoodsUseCAS(Goods goods);

mapper.xml

        

GoodsDaoTest测试类

@Test  public void goodsDaoTest(){      int goodsId = 1;      //根据相同的id查询出商品信息,赋给2个对象      Goods goods1 = this.goodsDao.getGoodsById(goodsId);      Goods goods2 = this.goodsDao.getGoodsById(goodsId);            //打印当前商品信息      System.out.println(goods1);      System.out.println(goods2);            //更新商品信息1      goods1.setStatus(2);//修改status为2      int updateResult1 = this.goodsDao.updateGoodsUseCAS(goods1);      System.out.println("修改商品信息1"+(updateResult1==1?"成功":"失败"));            //更新商品信息2      goods1.setStatus(2);//修改status为2      int updateResult2 = this.goodsDao.updateGoodsUseCAS(goods1);      System.out.println("修改商品信息2"+(updateResult2==1?"成功":"失败"));  }

输出结果:

good id:1,goods status:1,goods name:道具,goods version:1  good id:1,goods status:1,goods name:道具,goods version:1  修改商品信息1成功  修改商品信息2失败

说明:

在GoodsDaoTest测试方法中,我们同时查出同一个版本的数据,赋给不同的goods对象,然后先修改good1对象然后执行更新操作,执行成功。然后我们修改goods2,执行更新操作时提示操作失败。此时t_goods表中数据如下:

mysql> select * from t_goods;  +----+--------+------+---------+  | id | status | name | version |  +----+--------+------+---------+  |  1 |      2 | 道具 |       2 |  |  2 |      2 | 装备 |       2 |  +----+--------+------+---------+  2 rows in set    mysql>

我们可以看到 id为1的数据version已经在第一次更新时修改为2了。所以我们更新good2时update where条件已经不匹配了,所以更新不会成功,具体sql如下:

update t_goods   set status=2,version=version+1  where id=#{id} and version=#{version};

这样我们就实现了乐观锁。

以上就是mysql乐观锁是什么?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/889080.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
抖音网页版入口在线直达_2026抖音官方网页链接
上一篇 2025年11月28日 14:09:25
国产科幻机甲游戏《解限机》定档7月2日公测,登顶Steam国产游戏愿望单榜首
下一篇 2025年11月28日 14:09:31

相关推荐

  • 宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强

    宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强宏碁非凡 Go Air 超轻薄本发布,轻便耐用性能强

    宏碁非凡go air超轻薄本惊艳上市,仅重999克,售价4999元,首发更享国家补贴,到手价仅需3999.2元!这款轻薄本采用镁铝合金机身,搭配时尚的星辰灰配色,兼顾轻便与耐用性。 性能方面,非凡Go Air搭载强劲的英特尔酷睿i7-13260H处理器,拥有10核16线程,最高睿频可达4.9GHz,…

    2026年9月27日 • 用户投稿
    000
  • 漫蛙防走失地址收藏页独家分享 2025漫蛙最新官方网站导航

    漫蛙防走失地址收藏页独家分享 2025漫蛙最新官方网站导航漫蛙防走失地址收藏页独家分享 2025漫蛙最新官方网站导航漫蛙防走失地址收藏页独家分享 2025漫蛙最新官方网站导航漫蛙防走失地址收藏页独家分享 2025漫蛙最新官方网站导航

    答案:漫蛙2025最新官网导航提供manwa.cc、manwa.vip等多个防走失入口,建议收藏备用域名并关注官方动态以防失效。平台界面简洁,支持多种阅读模式,资源更新快,检索功能强,历史记录可同步,提升流畅追漫体验。 漫蛙防走失地址收藏页独家分享 2025漫蛙最新官方网站导航,这是许多用户近期热议…

    2026年9月27日 • 用户投稿
    300
  • 获取父级 Option Group 的文本标签

    获取父级 Option Group 的文本标签获取父级 Option Group 的文本标签获取父级 Option Group 的文本标签获取父级 Option Group 的文本标签

    本文介绍了如何使用 JavaScript 获取 HTML 元素中选定 标签的父级 标签的文本标签。重点在于理解 closest() 方法的行为,以及嵌套 标签可能带来的问题,并提供替代方案以实现所需功能。 理解 closest() 方法 在 JavaScript 中,closest() 方法用于查找…

    2026年9月27日 • 用户投稿
    000
  • MySQL默认账号密码的设定有哪些要求?

    MySQL默认账号密码的设定有哪些要求?MySQL默认账号密码的设定有哪些要求?MySQL默认账号密码的设定有哪些要求?MySQL默认账号密码的设定有哪些要求?

    MySQL默认账号密码的设定有哪些要求? MySQL是一种流行的开源关系型数据库管理系统,用于管理和存储大量数据。在安装MySQL时,会设置一个默认的账号密码,以确保数据安全性。默认账号密码的设定有一些要求和注意事项,本文将介绍MySQL默认账号密码的要求和示例代码。 一、账号要求: 默认的超级用户…

    2026年9月27日 • 用户投稿
    000
  • 如何确定 MySQL 的主机名?

    如何确定 MySQL 的主机名?如何确定 MySQL 的主机名?如何确定 MySQL 的主机名?如何确定 MySQL 的主机名?

    如何确定 MySQL 的主机名? 在使用 MySQL 数据库时,有时候我们需要确定 MySQL 数据库的主机名来进行连接操作。确定 MySQL 的主机名其实并不复杂,下面将详细介绍如何确定 MySQL 的主机名,并附上代码示例。 首先,我们可以通过以下几种方式来确定 MySQL 的主机名: 通过配置…

    2026年9月27日 • 用户投稿
    100
  • 在WildFly中集成EJB与JAX-WS:解决部署与访问难题

    在WildFly中集成EJB与JAX-WS:解决部署与访问难题在WildFly中集成EJB与JAX-WS:解决部署与访问难题在WildFly中集成EJB与JAX-WS:解决部署与访问难题在WildFly中集成EJB与JAX-WS:解决部署与访问难题

    本文详细介绍了在WildFly应用服务器上,将EJB(Enterprise JavaBeans)与JAX-WS(Java API for XML Web Services)项目整合到EAR(Enterprise Archive)中的实践。教程涵盖了多模块Maven项目结构、依赖管理、以及如何解决部署…

    2026年9月27日 • 用户投稿
    000
  • 解决MySQL安装中文乱码问题的有效途径

    解决MySQL安装中文乱码问题的有效途径解决MySQL安装中文乱码问题的有效途径解决MySQL安装中文乱码问题的有效途径解决MySQL安装中文乱码问题的有效途径

    标题:解决MySQL安装中文乱码问题的有效途径及代码示例 随着互联网的发展,数据处理变得越来越重要,而数据库则成为了数据存储和管理的重要工具之一。MySQL作为一款开源的关系型数据库管理系统,在各种应用场景中被广泛使用。然而,由于字符集的差异,有时在MySQL安装和配置过程中会出现中文乱码的问题,给…

    2026年9月27日 • 用户投稿
    000
  • 漫番漫画网页版入口_ 漫番漫画官网直达通道

    漫番漫画网页版入口_ 漫番漫画官网直达通道漫番漫画网页版入口_ 漫番漫画官网直达通道漫番漫画网页版入口_ 漫番漫画官网直达通道漫番漫画网页版入口_ 漫番漫画官网直达通道

    漫番漫画官网直达通道为https://manwa.me,该平台资源类型全面覆盖日漫、韩漫、国产漫画及欧美图像小说,满足多元阅读需求。界面设计简洁直观,首页分类清晰,支持关键词模糊搜索,阅读页面操作便捷,具备自定义调节与断点续读功能。多端同步体验流畅,适配移动端浏览器,支持账号登录实现收藏与记录云端同…

    2026年9月27日 • 用户投稿
    100
  • laravel怎么实现乐观锁防止并发数据修改_laravel乐观锁并发控制实现方法

    laravel怎么实现乐观锁防止并发数据修改_laravel乐观锁并发控制实现方法laravel怎么实现乐观锁防止并发数据修改_laravel乐观锁并发控制实现方法laravel怎么实现乐观锁防止并发数据修改_laravel乐观锁并发控制实现方法laravel怎么实现乐观锁防止并发数据修改_laravel乐观锁并发控制实现方法

    答案:Laravel中可通过版本号、时间戳或Trait实现乐观锁。使用版本号字段在更新时校验一致性,避免数据覆盖;利用updated_at时间戳比较读取与当前值确保并发安全;封装共用逻辑为OptimisticLock Trait提升代码复用性与维护性。 如果您在使用 Laravel 开发 Web 应…

    2026年9月27日 • 用户投稿
    200
  • 解决多层级关联表级联删除失败的策略与实践

    解决多层级关联表级联删除失败的策略与实践解决多层级关联表级联删除失败的策略与实践解决多层级关联表级联删除失败的策略与实践解决多层级关联表级联删除失败的策略与实践

    本文旨在深入探讨在多层级数据库关联中(如祖父-父-子关系)如何有效处理级联删除引发的SQLIntegrityConstraintViolationException。我们将重点分析外键约束的工作原理,并提供基于数据库设计和SQL语句的解决方案,包括使用ON DELETE CASCADE、ON DEL…

    2026年9月27日 • 用户投稿
    500
  • MySQL事务应用指南:5种情况下最适合使用事务

    MySQL事务应用指南:5种情况下最适合使用事务MySQL事务应用指南:5种情况下最适合使用事务MySQL事务应用指南:5种情况下最适合使用事务MySQL事务应用指南:5种情况下最适合使用事务

    MySQL事务应用指南:5种情况下最适合使用事务,需要具体代码示例 在数据库管理领域中,事务处理是一种重要的技术手段,可以确保数据库操作的一致性、完整性和可靠性。而MySQL作为一种流行的关系型数据库管理系统,也提供了强大的事务支持。在实际应用中,合理地运用事务可以有效地保证数据的准确性和可靠性。本…

    2026年9月27日 • 用户投稿
    000
  • laravel怎么在命令行下运行指定的测试用例_laravel命令行运行指定测试方法

    laravel怎么在命令行下运行指定的测试用例_laravel命令行运行指定测试方法laravel怎么在命令行下运行指定的测试用例_laravel命令行运行指定测试方法laravel怎么在命令行下运行指定的测试用例_laravel命令行运行指定测试方法laravel怎么在命令行下运行指定的测试用例_laravel命令行运行指定测试方法

    可直接通过命令行运行指定测试文件或方法。使用 php artisan test 指定路径执行单个测试文件,如 tests/Feature/ExampleTest.php;通过 –filter 参数运行特定方法,如 test_example_method;支持通配符批量执行相关测试,如 t…

    2026年9月27日 • 用户投稿
    100
  • laravel怎么实现一个自定义的Artisan命令交互式问答_laravel自定义Artisan交互式命令实现方法

    laravel怎么实现一个自定义的Artisan命令交互式问答_laravel自定义Artisan交互式命令实现方法laravel怎么实现一个自定义的Artisan命令交互式问答_laravel自定义Artisan交互式命令实现方法laravel怎么实现一个自定义的Artisan命令交互式问答_laravel自定义Artisan交互式命令实现方法laravel怎么实现一个自定义的Artisan命令交互式问答_laravel自定义Artisan交互式命令实现方法

    首先创建自定义Artisan命令类,通过ask()、secret()、confirm()和choice()方法实现交互式问答流程,支持文本输入、密码隐藏、确认提示及选项选择。 如果您希望在 Laravel 中通过 Artisan 命令与用户进行交互式问答,可以通过内置的询问方法收集用户输入并作出相应…

    2026年9月27日 • 用户投稿
    200
  • 构建用户-员工关联的图片上传系统:实现员工为特定用户上传文件

    本文详细阐述了如何构建一个系统,使员工能够为特定用户上传文件(例如QR码),并确保文件与用户准确关联。核心在于优化数据库结构,为上传的文件表引入用户ID外键,并在前端上传表单和后端处理逻辑中实现用户ID的传递与存储,从而实现用户专属内容的管理与展示。 1. 引言:明确用户与文件关联的需求 在许多业务…

    2026年9月27日
    100
  • MySQL事务的隔离级别与并发控制

    MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制MySQL事务的隔离级别与并发控制

    标题:深入探讨MySQL事务的隔离级别与并发控制 随着数据库应用场景的日益复杂,事务的隔离级别与并发控制成为了数据库管理中不可或缺的重要话题。MySQL作为一款广泛使用的关系型数据库管理系统,其事务处理功能也备受广大开发者重视。本文将深入探讨MySQL事务的隔离级别与并发控制,并结合具体的代码示例进…

    2026年9月27日 • 用户投稿
    000
  • laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法

    laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法laravel怎么动态地修改当前请求的数据库连接_laravel动态修改请求数据库连接方法

    可通过DB门面切换连接,使用DB::connection(‘mysql_secondary’)执行特定查询;2. 修改模型实例连接,调用setConnection()改变数据源;3. 利用中间件如TenantDatabaseMiddleware解析请求信息并动态设置默认连接;…

    2026年9月27日 • 用户投稿
    300
  • MySQL事务的基本概念解析

    MySQL事务的基本概念解析MySQL事务的基本概念解析MySQL事务的基本概念解析MySQL事务的基本概念解析

    MySQL事务的基本概念解析 MySQL是一种常用的关系型数据库管理系统,支持事务处理。事务是数据库操作的基本单位,通过事务可以保证一系列操作的原子性、一致性、隔离性和持久性。本文将详细介绍MySQL事务的基本概念,并通过具体的代码示例来演示。 一、事务的概念和特性事务是一系列数据库操作的逻辑单位,…

    2026年9月27日 • 用户投稿
    100
  • Kafka批处理监听器中反序列化异常的重试策略与实现

    Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现Kafka批处理监听器中反序列化异常的重试策略与实现

    本文详细介绍了如何在Spring Kafka批处理监听器中有效处理并重试反序列化异常。通过修改DefaultErrorHandler以取消对DeserializationException的致命标记,并结合监听器内部对带有null载荷的消息进行异常信息提取和重新抛出,实现对整个批次消息的重试,从而提…

    2026年9月27日 • 用户投稿
    000
  • 如何在Windows和Linux服务器中检测混淆命令

    如何在Windows和Linux服务器中检测混淆命令如何在Windows和Linux服务器中检测混淆命令如何在Windows和Linux服务器中检测混淆命令如何在Windows和Linux服务器中检测混淆命令

    工具介绍 在目前的无文件恶意软件或网络犯罪领域中,命令行混淆已经是很常见的了。为了绕过基于签名的安全检测机制,红队渗透测试以及apt攻击活动都会使用各种专用的混淆/模糊技术。同时,许多代码混淆工具(即执行语法转换工具)都已开源,这也使得网络攻击者们对给定命令进行混淆处理变得越来越容易了。 然而,针对…

    2026年9月27日 • 用户投稿
    1000
  • laravel怎么实现模型的多态关联_laravel模型多态关联实现方法

    多态关联可实现一个模型关联多种类型模型,如评论属于文章或视频。首先创建含commentable_id和commentable_type字段的迁移表并建立索引,执行迁移;在Comment模型中定义morphTo,在Post和Video模型中定义morphMany;保存时通过模型实例自动填充类型与ID;…

    2026年9月27日
    100

发表回复

登录后才能评论
关注微信