乐观锁的两种实现方式

什么场景下需要使用锁?

在多节点部署或者多线程执行时,同一个时间可能有多个线程更新相同数据,产生冲突,这就是并发问题。这样的情况下会出现以下问题:
更新丢失:一个事务更新数据后,被另一个更新数据的事务覆盖。
脏读:一个事务读取另一个事物为提交的数据,即为脏读。
其次还有幻读。。
针对并发引入并发控制机制,即加锁。
加锁的目的是在同一个时间只有一个事务在更新数据,通过锁独占数据的修改权。

锁的实现方式

1、悲观锁,前提是,一定会有并发抢占资源,强行独占资源,在整个数据处理过程中,将数据处于锁定状态。
2、乐观锁,前提是,不会发生并发抢占资源,只有在提交操作的时候检查是否违反数据完整性。只能防止脏读后数据的提交,不能解决脏读。
当然,还有其他的锁机制,暂时不多介绍,着重于乐观锁的实现。
乐观锁,使用版本标识来确定读到的数据与提交时的数据是否一致。提交后修改版本标识,不一致时可以采取丢弃和再次尝试的策略。
记录1,id,status1,status2,stauts3,version,表示有三个不同的状态,以及数据当前的版本
操作1:update table set status1=1,status2=0,status3=0 where id=111;  
操作2:update table set status1=0,status2=1,status3=0 where id=111;
操作3:update table set status1=0,status2=0,status3=1 where id=111;
没有任何控制的情况下,顺序执行3个操作,最后前两个操作会被直接覆盖。
加上version字段,每一次的操作都会更新version,提交时如果version不匹配,停止本次提交,可以尝试下一次的提交,以保证拿到的是操作1提交后的结果。
这是一种经典的乐观锁实现。
另外,java中的compareandswap即cas,解决多线程并行情况下使用锁造成性能损耗的一种机制。
CAS操作包含三个操作数,内存位置(V),预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会西东将该位置值更新为新值。否则,处理器不做任何操作。
记录2: id,stauts,status 包含3种状态值 1,2,3
操作,update status=3 where id=111 and status=1;
即 如果内存值为1,预期值为1,则修改新值。对于没有执行的操作则丢弃。
思考:这两种方式有什么区别?

转载于:https://www.cnblogs.com/ywfblogs/p/9679824.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++编译时候fatal error C1075: end of file found before the left brace '{' at

出现 C:\Users\acer\Downloads\Cpp2.cpp(591) : fatal error C1075: end of file found before the left brace { at C:\Users\acer\Downloads\Cpp2.cpp(357) was matched 执行 cl.exe 时出错. 谁知道怎么求改?? 答: 程序中 {} 不是成对出现…

Cloud Foundry Java客户端–流事件

Cloud Foundry Java客户端提供了基于Java的绑定,用于与正在运行的Cloud Foundry实例进行交互。 这个项目的优点之一是它采用了基于Reactive Stream的API作为方法签名,特别是使用Reactor实现,这在使用流数据时特别有用。 在这篇文章中&#x…

vue导入html登陆页,Vue 实现 登陆后打开主页面(登陆组件 + 主页面组件)

本次演示,项目所需iview,router首先在 views 目录 新建 两个 组件 ( login.vue ,index.vue )login.vue登录登 录export default {methods: {login() {// 假设登陆成功,则跳转到 index 组件this.$router.replace(/index);}}}backgr…

设置窗口大小

window.resizeTo(screen.availWidth, screen.availHeight);转载于:https://www.cnblogs.com/7q4w1e/p/9680037.html

android IO流_Flutter实战经验(十):打包和发布到 Android 平台

本文适合ios开发者不清楚Android上架机制学习。在一般的开发过程中,我们可以使用 flutter run 命令,或者 IntelliJ 工具栏中的 Run 和 Debug 来测试 app。这时候,Flutter 默认会为我们构建 app 的调试版本。当想要发布 app 时,比如…

西安单招学校学计算机软件的,西北大学软件职业技术学院单招

西北大学肇始于1902年的陕西大学堂和京师大学堂速成科仕学馆,1912年始称西北大学,1978年被确定为全国重点大学。现为国家“211工程”建设院校、教育部与陕西省共建高校。在长期的办学历程中,西北大学形成了“发扬民族精神,融合世界…

autojs遍历当前页面所有控件_PyQT5控件:容器(Containers Widgets)

QWidget主窗体容器 在Qt设计师中新建文件,选择QWidget QWidget属性 enabled 窗口部件是否有效geometry 窗口部件相对于其父窗口的几何图形,并排除窗口框架sizePolicy 窗口部件的默认布局行为minimumSize 窗口部部件的最小尺寸(以像素为单位&a…

JAVA 技术类分享(一)

一、dubbo dubbo原理模型? 主要是注册中心,服务提供者,服务消费者,监控中心,其中后者可有可无。1.服务端,在注册中心注册自己提供的服务,并暴露端口,2.客户端在注册中心注册&#xf…

计算机的就业指导论文,计算机就业指导期刊文章参考文献 计算机就业指导专著类参考文献有哪些...

为论文写作提供【100个】计算机就业指导期刊文章参考文献,海量计算机就业指导相关论文参考文献,包括期刊,专著,外文参考文献,解决您的计算机就业指导专著类参考文献有哪些的相关难题!一、计算机就业指导论文参考文献范文[1]“基于就业岗位需求”的专业课程体系建设的…

junit rule_使用JUnit的ExpectedException和@Rule测试自定义异常

junit rule异常测试 为什么要测试异常流? 就像所有代码一样,测试覆盖率在代码和应该产生的业务功能之间写了一个合同,从而为您提供了代码的有效文档 ,以及可以尽早且经常强调功能的附加功能。 我不会介绍测试的许多好处&#xff0…

经纬度1秒约等于多少米?

WGS84坐标系统下(通常我们采用的GPS内的坐标系统) 如果是中国常用的WGS1984的经纬度坐标,1秒相当于33米。具体如下: 经度1度85.39km 经度1分 1.42km 经度1秒 23.6m 纬度1度 大约111km 纬度1分 大约1.85km 纬度1秒 大约30.9m

学计算机单招可以报那几个公立学校,为什么要选择公办单招学校,四川公办单招学校有哪些?...

高职单招单招被称为春季高考,在四川参加单招考试的学生逐年上升,周时参加单招的高职院校也越来越多。但是单招不像是高考可以通过不同的志愿,来填报多所学校。单招只能选择某一个学校,一旦确定就不能更改。这样的结果就是选择学校…

AutoValue:生成的不可变值类

Google GitHub托管的项目AutoValue之所以有趣,有多种原因。 该项目不仅使为“ 值对象 ”编写更少的Java代码变得容易,而且还为Java注释处理的实际应用提供了概念上简单的演示。 该自动/值项目是由提供谷歌的员工凯文Bourrillion和埃蒙麦克马纳斯和许可与…

exit(0)与exit(1)、return区别

exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序; return():返回函数,若在主函数中,则会退出函数并返回…

上海教师计算机等级要求,计算机考试阅卷教师谈等级考试

等级考试笔试是由选择题和填空题两大部分组成。选择题是由阅卷系统改卷,而填空题是由阅卷教师评阅,下面我们就从分析阅卷的得分丢分情况来谈谈如何让阅卷教师在公平、公正的前提下尽可能的给予"高分",让考生尽量避免不必要的"…

C++读取文本文件中以TAB作为分隔符,且中间字段有为空的情况的方法?

数据文件:testData.txt 内容: 111 222 444 555思路: getline()将testData.txt中的第一行记录读入到一个string中,然后搜索第n个分隔符进行定位,判断第n个字段长度,使用substr&#x…

宿迁学计算机的学校,宿迁计算机学校

01、宿迁计算机学校培养目标培养学生具有基本的审美能力,利用常用的平面设计软件进行多媒体产品开发、广告设计与创意、印刷品的设计、展览展示等能力,能够从事多媒体产品开发,广告设计与创意,印刷品的设计,展览展示等…

javaone_JavaOne 2012:调查JVM水晶球

javaone我周一回到了希尔顿的A / B广场参加第四届会议,但首先去了希尔顿的顶层收拾午餐。 我每年都在JavaOne的第一天被提醒,对于参与的每个人来说,第一天的午餐获取过程令人惊讶地令人沮丧。 我知道我在JavaOne的第一年的经历使我有些困惑&a…

VS2008编译boost库

一、下载 首先从boost官方主页http://www.boost.org/下载最新版boost安装包,我用的版本是boost.1.49.0 二、新建文件夹 如果是使用下载的安装包,那么请将boost安装包解压至本地新建的目录,如:F:\boost 三、编译 (1&am…

rtk采点后如何导入cad_【干货】RTK实操视频:工程之星5.0操作攻略!(第五部分)...

前期回顾:【干货】RTK实操视频:工程之星5.0操作攻略!(第一部分)【干货】RTK实操视频:工程之星5.0操作教程(第二部分)【干货】RTK实操视频:工程之星5.0操作攻略!(第三部分)【干货】RTK实操视频:工…