一、为什么需要锁(并发控制)?
      在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。
      典型的冲突有:
        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表时不发生冲突;

MYSQL数据库乐观锁之设计version字段相关推荐

  1. mysql乐观锁 秒杀_使用数据库乐观锁解决高并发秒杀问题,以及如何模拟高并发的场景,CyclicBarrier和CountDownLatch类的用法...

    数据库:mysql 数据库的乐观锁:一般通过数据表加version来实现,相对于悲观锁的话,更能省数据库性能,废话不多说,直接看代码 第一步: 建立数据库表: CREATE TABLE `skill_ ...

  2. 浅谈实现数据库乐观锁和悲观锁

    目录 数据库乐观锁 适用场景 定义 实现方式 优点与缺点分析 优点 缺点 案例 数据库悲观锁 适用场景 定义 实现方式 悲观锁优缺点分析 优点 缺点 在单实例JVM中,常见的处理并发问题的方法有很多, ...

  3. 数据库乐观锁和悲观锁的理解和实现(转载amp;总结)

    数据的锁定分为两种,第一种叫作悲观锁,第二种叫作乐观锁. 1.悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.[数据锁定:数据将暂时不会 ...

  4. 数据库乐观锁如何实现幂等性?

    数据库乐观锁方案一般只能适用于执行更新操作的过程,我们可以提前在对应的数据表中多添加一个字段,充当当前数据的版本标识. 这样每次对该数据库该表的这条数据执行更新时,都会将该版本标识作为一个条件,值为上 ...

  5. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效

    问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...

  6. mysql设置乐观锁_mysql数据库怎么设置乐观锁

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

  7. oracle数据库字段的值加一_天天面试--数据库乐观锁和悲观锁

    悲观锁 悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.悲观锁:假 ...

  8. MySQL数据库的锁(什么是数据库的锁?什么是乐观锁和悲观锁?什么是死锁?如何避免?)

    数据库的锁 什么是数据库的锁? 数据库的锁与隔离级别的关系? 数据库锁的类型有哪些? MySQL中InnoDB引擎的行锁模式及其是如何实现的? 什么是数据库的乐观锁和悲观锁,如何实现? 什么是死锁?如 ...

  9. 浅谈数据库乐观锁、悲观锁

    来自:非科班的科班 并发问题 当程序中出现并发的问题时,我们就要有相应的手段保证数据的正确性,防止多个用户在操作数据的时候,出现和预期数据不一样的现象,产生脏数据,在数据库的层面如果没有做好并发控制, ...

最新文章

  1. 使用openpyxl处理表格数据
  2. SharePoint 2016 必备组件离线安装介绍
  3. 使用DDMS中的内存监测工具Heap来优化内存
  4. System.img是如何打包的
  5. java 工作 日期转换代码,判断是否是当天,然后日期转换
  6. zTree:实现单选/取消父子关联等
  7. 项目经历怎么写_这样写项目经历可以锦上添花
  8. vs code的tabs模式的终端
  9. 如何在Mac上访问 USB 驱动器?
  10. 2018/3/27 省选模拟赛 140分
  11. python标准库——datetime模块
  12. HP电脑的增霸卡功能操作详解
  13. 计算机安装Hp1005打印机,hp1005打印机驱动安装使用方法 常见问题解答分享
  14. 去掉右键烦人的多余菜单项
  15. MATLAB之线性回归方程模型
  16. C语言利用二叉树的操作实现根据给定的字符串生成二叉树并前序、中序、后序输出二叉树。
  17. 所以Web 3.0到底是什么?
  18. [附源码]计算机毕业设计JAVA网上书店管理系统
  19. 什么是函数式编程?总结
  20. 使用navicat连接mysql出现提示10038错误的解决方法

热门文章

  1. 非root用户免密ssh登录到linux---防破解!!
  2. Python参数化接口测试demo笔记
  3. Marvell88Q5192 switch调试记录(BSTA1000B平台)
  4. matlab 设置采样时间设置,不建议设置采样时间的模块
  5. 【网络】解释Http协议,URL,Http的格式。
  6. 关于实名认证上线时无法立即返回实名认证结果的问题
  7. 仿淘宝商品界面(html div+css)
  8. POJ-2566,HDU-1058,POJ-3320,POJ-3061(尺取法)
  9. 【漫画】各大互联网公司的真实“人”生
  10. 2021.07.07 宇信科技