悲观锁和乐观锁的使用[通俗易懂]

悲观锁和乐观锁的使用[通俗易懂]1、悲观锁(PessimisticLock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。最常用的就是select..forupdate,它是一种行锁,会把select出来的结果行锁住,在本

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1、悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
最常用的就是 select … for update,它是一种行锁,会把select出来的结果行锁住,在本事务提交或者回滚之前,不允许其他事务对这些行做update、delete、for update操作。

2、乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,期间该数据可以随便被其他人读取,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
版本号机制是乐观锁最常用的方式,就是在表中增加一个版本号的字段,更新前先查一遍获取版本号,再作为更新语句的where条件进行更新,如果数据在获取版本号之后,在更新之前已经改变了,那就会更新失败,因为最后更新了0条数据,java后台拿到更新数如果为0,则说明更新失败,出现了并发问题,然后做具体的处理。
例如有两个人同时对某条数据做修改,过程如下:
操作员A操作如下:
select id, balance, version from table where id=“1”;
查询结果:id=1, balance=1000, version=1

update table set balance=balance+100, version=version+1 where id=“1” and version=1;
执行后,返回的更新结果是1,说明更新了一条,数据库里的结果是:id=1, balance=1100, version=2

操作员B操作如下:
select id, balance, version from table where id=“1”;
查询结果:id=1, balance=1000, version=1, 说明操作员A还没修改。

update table set balance=balance-50, version=version+1 where id=“1” and version=1 ;
查的时候,操作员A还没修改,当要更新时,操作员A已经先修改成功,所以数据库里实际值是id=1, balance=1100, version=2,
操作员B也将版本号加一(version=2)试图向数据库提交数据(balance=950),但此时查不到where id=“1” and version=1 的数据,
所以update就失败了,执行结果是0,说明没有对任何数据更新成功。

现在再去查一下,结果还是操作员A操作完成之后的结果
select id, balance, version from table where id=“1”;
查询结果:id=1, balance=1100, version=2

以上是自己实现版本号机制的原理,真正使用的版本号机制是数据库本身带有的机制,一旦发现更新的版本号不是最新的就会被驳回。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172321.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 优麒麟 2204 安装 Fcitx5 输入法

    优麒麟 2204 安装 Fcitx5 输入法Fcitx5是继Fcitx之后的新一代输入法框架,优麒麟2204默认安装的是Fcitx,而Fcitx和Fcitx5是相互冲突的,因此安装Fcitx5之前需要先卸载Fcitx。

    2022年7月14日
    22
  • Python + allure 报告[通俗易懂]

    Python + allure 报告[通俗易懂]安装Windows安装allure需要先安装scoop,确保安装了PowerShell5(或更高版本,包括PowerShellCore)和.netFramework4.5(或更高版本)。然后打开PowerShell运行:iex(new-objectnet.webclient).downloadstring(‘https://get.scoop.sh’)安装allure:sco…

    2022年7月26日
    7
  • webpack 版本冲突详细原因分析及解决办法「建议收藏」

    webpack 版本冲突详细原因分析及解决办法「建议收藏」本项目使用vue/cli-4构建,在安装完less-loader后,npmrunserve时候报错,原因是webpack版本冲突报错信息Error:Rulecanonlyhaveoneresourcesource(providedresourceandtest+include+exclude)in{“exclude”:[null],“use”:[{“loader”:“/Users/truezir_tech_team/WebstormProject

    2022年8月10日
    45
  • 系统首选dns服务器修改,Windows系统首选DNS如何设置

    系统首选dns服务器修改,Windows系统首选DNS如何设置Windows系统首选DNS如何设置的呢,有时候可能需要修改或者调整DNS服务器地址的设置,以达到优化网络连接速度的效果。该怎么办?下面是学习啦小编收集整理的Windows系统首选DNS如何设置,希望对大家有帮助~~Windows系统首选DNS的设置方法一:在图形界面下设置DNS服务器址1这里Windows8为例,首先在屏幕的右下角找到“网络连接”图标,如图所示2在“网络连接”…

    2022年5月4日
    93
  • linux下编译jrtplib-3.9.1

    一、下载jrtplib、jthreadjrtplib:http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.9.1.zipjthread:http://research.edm.uhasselt.be/jori/jthread/jthread-1.3.1.zipCMake:https://cmake.org/downl

    2022年4月8日
    41
  • kl散度和交叉熵的区别_散度的概念

    kl散度和交叉熵的区别_散度的概念通用的说,熵(Entropy)被用于描述一个系统中的不确定性(theuncertaintyofasystem)。在不同领域熵有不同的解释,比如热力学的定义和信息论也不大相同。要想明白交叉熵(CrossEntropy)的意义,可以从熵(Entropy)->KL散度(Kullback-LeiblerDivergence)->交叉熵这个顺序入手。当然,也有多种解释方法…

    2022年10月23日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号