乐观锁,大多是基于数据版本(Version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。

版本号

读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。

update tb_goods

set status=2,version=version+1

where id=#{id} and version=#{version};

时间戳

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

条件限制

举个例子,当电商抢购活动时,大量并发进入,如果仅仅使用版本号或者时间戳,每次只会有一个用户扣减成功,不可避免的人为造成失败。

num-#{buyNum}>=0 ,这个情景适合不用版本号,只更新时做数据安全校验,适合库存模型,扣份额和回滚份额,性能更高。

UPDATE tb_goods

SET num = num - #{buyNum}

WHERE

id = #{id}

AND num - #{buyNum} >= 0

AND STATUS = 1

乐观锁的更新操作,最好用主键或者唯一索引来更新,这样是行锁,否则更新时会锁表。

mysql 乐观锁 时间戳_MySQL乐观锁相关推荐

  1. mysql内置乐观锁吗_mysql 乐观锁详解

    乐观锁: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制.悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性.但随之而来的就是 ...

  2. mysql 悲观锁 共享锁_MySQL 乐观锁 悲观锁 共享锁 排他锁

    乐观锁 乐观锁是逻辑概念上的锁,不是数据库自带的,需要我们自己去实现.乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁 ...

  3. mysql行锁还需要乐观锁吗_mysql行锁、表锁。乐观锁,悲观锁

    锁定用于确保事务完整性和数据库一致性. 锁定可以防止用户读取其他用户正在更改的数据,并防止多个用户同时更改相同的数据. 如果不使用锁定,数据库中的数据可能在逻辑上变得不正确,而针对这些数据进行查询可能 ...

  4. mysql数据库什么情况下会锁表_mysql数据库锁的产生原因及解决办法

    数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性 ...

  5. mysql 前后代表什么_MySQL的锁

    1.什么是锁 锁机制用于管理对共享资源的并发访问. lock与latch latch一般称为闩锁(轻量级的锁),因为其要求锁定的时间必须非常短.若持续的时间长,则应用的性能会非常差.在InnoDB存储 ...

  6. mysql某个表被行锁了_MySQL 行锁和表锁的含义及区别详解

    一.前言 对于行锁和表锁的含义区别,在面试中应该是高频出现的,我们应该对MySQL中的锁有一个系统的认识,更详细的需要自行查阅资料,本篇为概括性的总结回答. MySQL常用引擎有MyISAM和Inno ...

  7. mysql BDB支持表锁吗_mysql 表锁问题

    本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...

  8. mysql不同锁解释_MySQL 各种锁理解总结

    该文章举例都是基于 InnoDB 可重复读(RR)隔离级别的,mysql 版本 8.0 根据加锁的范围,MySQL 里面的锁大致可以分成全局锁.表级锁和行锁三类 全局锁 全局锁就是对整个数据库实例加锁 ...

  9. mysql间隙锁 打开_MySQL间隙锁问题

    间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间. 最近用户反馈说系统老是出现insert时,等待超时了,最后发现是ins ...

最新文章

  1. shell脚本的命令行传参
  2. 国内首档程序员真人秀?这不比博人传热血?!
  3. PhantomJS 基础及示例
  4. 遍历Repeater与ItemDataBound事件发现的几个问题。
  5. eeglab中文教程系列(9)-绘制ERP图像
  6. delimiter mysql报错_MySql中的DELIMITER错误
  7. 系统无法执行指定的程序。_使用Rust编写操作系统(一):独立式可执行程序
  8. unity创建项目报错:解决sentinel key not found (h0007) Unity
  9. 怎么看电脑能不能升级win10系统|检测电脑适不适合安装win10的方法
  10. 2017-2018-2 1723《程序设计与数据结构》第九周作业 第二周结对编程 总结
  11. 网络分析仪的校准和测试方法
  12. 微信素材管理,新增临时素材
  13. SQL/ORACLE_基础英语词汇
  14. 如何设计手机端banner图【电商小白】
  15. [三星移动硬盘] 磁盘必须经过格式化(无法显示)
  16. 这个时代“寒门再难出贵子”
  17. InfiniBand 网络
  18. python学习第五节:用面向对象实现friendbook
  19. 小视频app源码,邻接矩阵实现图的相关代码
  20. 七天免登录(Cookie+session)+ 页面显示动画人物效果(萌娘+气泡效果)+购物车的实现代码

热门文章

  1. 黑苹果facetime_如何在消息或FaceTime中添加或删除电话号码
  2. linux内核的自旋锁
  3. 使用Java播放MP3或Wav音频
  4. cinder的qos限速
  5. kivy mysql_Kivy中文显示
  6. 企业定制.NET开发培训
  7. java holder 遍历_如何获取所有RecyclerView ViewHolder?
  8. Spring Boot 中的热部署方式总结
  9. Excle常用函数——if函数
  10. AlexNet结构参数详解