悲观锁和乐观锁的简述


悲观锁(pessimistic lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

悲观锁和乐观锁的简述

最常用的就是 select … for update,它是一种行锁,会把select出来的结果行锁住,在本事务提交或者回滚之前,不允许其他事务对这些行做update、delete、for update操作。

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,期间该数据可以随便被其他人读取,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

版本号机制是乐观锁最常用的方式,就是在表中增加一个版本号的字段,更新前先查一遍获取版本号,再作为更新语句的where条件进行更新,如果数据在获取版本号之后,在更新之前已经改变了,那就会更新失败,因为最后更新了0条数据,j*a后台拿到更新数如果为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操作如下:

Trae国内版 Trae国内版

国内首款AI原生IDE,专为中国开发者打造

Trae国内版 2045 查看详情 Trae国内版
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

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

以上就是悲观锁和乐观锁的简述的详细内容,更多请关注其它相关文章!


# 如何在  # 就会  # 国内  # 查询结果  # 还没  # 顾名思义  # 悲观锁  # 淘宝微博推广营销方案  # 带视频的产品网站推广  # 雨花区长沙网站建设  # 长春网站网络推广  # 眉山建设局网站  # 网站建设的好处文案  # 抖音广告推广营销技巧  # 关键词排名易下拉  # 花艺活动营销推广图文  # 如何做教学平台网站推广  # 前先  # 去拿  # 最常用  # 结果是 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 苹果手机聊天记录删除了如何恢复  使用TinyButStrong生成HTML并结合Dompdf创建PDF教程  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践  Composer如何使用composer-plugin-api开发自定义插件  PHP页面重载时变量值不重置的实现方法  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口  word文档行距怎么调?word文档调行距的操作步骤  国际经济与贸易就业方向解析  蜻蜓FM如何设置移动流量播放  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  口腔诊所管理软件推荐  太平年在哪个平台播出  荣耀盒子应用管理技巧  mysql镜像配置如何设置用户权限组_mysql镜像配置用户组与权限分级管理方法  Linux如何自动分析系统异常日志_Linux日志智能检测  海棠阅读网页版_进入海棠网页版在线阅读中心  VB表达式书写规则解析  虫虫助手如何更新游戏  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  晨报|开发商暗示《空洞骑士:丝之歌》DLC开发中 《合金装备4》有望重制  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  免费占卜在线神算_免费占卜手机神算  顺丰官方查单号入口 顺丰快递单号查询官网入口  iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】  芒果TV官网登录入口 芒果TV官方网站登录入口  获取WooCommerce产品在后台编辑页面的分类ID  Python测试中模块导入路径解析的最佳实践  菜鸟裹裹怎样获得取件码_菜鸟裹裹获得取件码步骤  百度识图图像分析 百度识图识别平台  怎样设置开机后自动运行某个程序_Windows启动文件夹与任务计划【自动化】  Python模块化编程:避免循环导入与共享函数的最佳实践  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  PDF如何批量加注释_PDF多文件批注高亮操作教程  《单词速记宝》设置学习计划方法  Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置  TikTok搜索结果不显示怎么办 TikTok搜索刷新与优化方法  mysql如何限制远程访问_mysql远程访问限制方法  《鹿路通》退余额方法  研招网官方网站正版登录网址_中国研究生招生信息网官网首页  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  《U校园》学生登录入口2025  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  12306夜间购票失败? | 查看官方公布的暂停服务公告与应对方案  抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法  C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较  抖音猜你想搜能说明对方搜过吗 

 2019-09-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.