通过sql实现乐观锁

  • 什么是乐观锁
  • 乐观锁的实现

在开发工作中,我们不可避免地会遇到多个任务或应用同时操作同一条数据的情况。在这种情况下,如果不做任何措施,往往会出现数据脏读、脏写等问题,得到的结果不可预知,甚至导致生产事故的出现。因此,我们通常对会出现并发读写的数据上锁来防止这一问题的发生。
以下就是介绍其中的一种锁——乐观锁。

什么是乐观锁

在说明什么是乐观锁之前,需要先说明什么是悲观锁。
其实形象地说,悲观锁就好比去小摊子排队买早餐,只能一人一人按排队顺序购买,后面的人需要等待前面的人买好后才能上前点餐购买,也就是阻塞的。
所以,悲观锁就是认为当一条数据正在被读写时,一定也存在另一处程序或应用想要读写这条数据,所以直接将这条数据锁住,除当前读写者外其它想要读写这条数据的程序或应用都需要等待锁的释放。当这条数据被读写完毕后锁才会被释放。
那么乐观锁说白了就是”锁“写不锁读。这里的锁为什么要加双引号,因为实际上乐观锁并没有强制你不能去写,只是告诉你这条数据在你读取和修改的时间间隙内已经被其它人修改了,如果你觉得有风险那么就放弃这次修改,重新读取后再去修改。也就是乐观锁不强制控制权限,只是把风险告知用户让用户自行决定是否继续修改。
举一个形象的例子,就是去肯德基用手机点餐。假设这一家肯德基只支持手机点餐,那么所有客人在点餐的时候都是一种”读“行为,领餐时就是一种”写“行为(实际上肯德基的点餐逻辑也是如此)。比如点餐时看到的某一菜品还有剩余便点下了,到前台领餐的时候才被告知该菜品当日已售罄,那么此时用户可以选择下次再来或者重新看菜单更换菜品。
这就是一种乐观锁机制,不阻塞,性能也较好,但是对程序的逻辑性要求就会比悲观锁高一些。

乐观锁的实现

下面介绍一种通过表字段来实现乐观锁的方法。

  1. 创建一张带version字段的表或给原有的表加上version字段
 create table op_table (id varchar(50) primary key,name varchar(20),version int);
 alter table src_table add version int;
  1. 编写sql脚本
    这里只给出原始的sql,至于使用什么ORM框架去实现需要根据项目来。
 select * from op_table where id = '要修改的数据的id';
 update op_tableset name = '乐观锁', version = if(version > 100, 0, version+1)where id = '要修改的数据的id' and version = n

version = n中的n具体数值为读取到该条数据时候获取的version值

【Java】如何实现乐观锁相关推荐

  1. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...

  2. Java之原子性-乐观锁与悲观锁

    1.volatile-问题 1.1.代码分析 : package com.itheima.myvolatile;public class Demo {public static void main(S ...

  3. Java 面试 :乐观锁 悲观锁

    乐观锁悲观锁,是为了解决多线程并发操作共享变量可能导致的脏读.幻读和不可重复读等问题 悲观锁 悲观锁,是因为这是一种对数据的修改持有悲观态度的并发控制方式.总是假设最坏的情况,每次读取数据的时候都默认 ...

  4. 大聪明教你学Java | 深入浅出聊乐观锁与悲观锁(synchronized 悲观锁)

    前言 "锁"一直是一个老生常谈问题,尤其是在面试的过程中我们常常会被问到"锁"的一些相关的问题,其中就数"悲观锁"和"乐观锁&qu ...

  5. Java并发:乐观锁

    简介 悲观锁和乐观锁都属于比较抽象的概念: 我们可以用拟人的手法来想象一下: 悲观锁:像有些人,凡事都往坏的想,做最坏的打算:在java中就表现为,总是认为其他线程会去修改共享数据,所以每次操作共享数 ...

  6. 【Java基础】乐观锁和悲观锁的实现

    一.乐观锁 1. 概念 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁.但是如果想要更新数据,则会在更新前检查在读取至更新这段时间别人有 ...

  7. Java多线程:乐观锁、悲观锁、自旋锁

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

  8. 【深度解析】Java中的乐观锁、悲观锁

    前言 关于线程安全一提到可能就是加锁,在面试中也是面试官百问不厌的考察点,往往能看出面试者的基本功和是否对线程安全有自己的思考. 那锁本身是怎么去实现的呢?又有哪些加锁的方式呢? 我今天就简单聊一下乐 ...

  9. 五分钟学会悲观乐观锁-java vs mysql vs redis三种实现

    1 悲观锁乐观锁简介 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果 ...

  10. JAVA并发编程:悲观锁与乐观锁

    生活 晴. 悲观与乐观的情绪概念 本篇来了解一下悲观锁和乐观锁,在了解这两个锁之前,我们首先有必要把悲观和乐观这两个词搞清楚: 悲观:对世事怀有消极的看法,认为事物总往糟糕的方向发展. 乐观:对世事怀 ...

最新文章

  1. LeetCode简单题之检查单词是否为句中其他单词的前缀
  2. python如何安装torch_PyTorch安装与基本使用详解
  3. 钩子运行机制HOOK
  4. 【机器学习】特征预处理
  5. 【蓝桥杯】基础练习 十进制转十六进制
  6. 基于PyQt的扫雷游戏实现_下篇
  7. 2014年辛星starphp第一节设置入口文件以及App类
  8. java同步器有哪些_Java 队列同步器 AQS
  9. c语言怎么把字符串转数组,【转】C语言 字符数组与字符串
  10. 【移动安全基础篇】——02、APP内付破解
  11. 1060显卡支持dx12吗_GTX1660和1060差距大吗?GTX1660和1060区别对比
  12. 基于ZStack3.0.1(CC2530)和ST7735S的HAL_LCD驱动替换(一)
  13. 杭电2019多校第三场 HDU-6608 Fansblog(威尔逊定理+素数间隔+逆元)
  14. Docker 网络(十一)——Docker Multi-host Network
  15. MySQL数据库任意IP连接设置
  16. GD32 CAN波特率计算问题
  17. Gitment给基于hexo的yilia主题的博客搭建免费评论系统
  18. vbs简单语法及简单案例
  19. 笔记本 android,震惊:这个秘籍可以让笔记本同时拥有(mac/win/Android)系统
  20. 硬盘位置不可用无法访问X:/指定不存在的设备?

热门文章

  1. pythom飞机大战
  2. 327页16万字市智慧人社项目建设方案(word可编辑)
  3. c 语言 函数返回数组_如何在C ++函数中返回数组
  4. vue 页面动态切换title keywords description (seo的设置)
  5. js解析MarkDown语法
  6. this指向和改变其指向的方法
  7. 获取java线程中信息的方法
  8. pcl 中的滤波与降采样
  9. 了解什么是服务质量QoS以及如何提高网络性能
  10. kill -9和kill -15区别