说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

乐观锁和悲观锁 你更钟情于哪一个?

HTML文档下载 WORD文档下载 PDF文档下载
对数据库的并发访问一直是应用程序开发者需要面对的问题之一,一个好的解决方案不仅可以提供高的可靠性还能给应用程序的性能带来提升。下面我们来看一下Couchbase产品市场经理Don Pinto结合Couchbase Server为我们带来的悲观锁和乐观锁的解析。

故事背景:Alice和Joe将共同读取Couchbase Server中的同一个数据,然后都将对数据做出修改;接着将新的版本写入数据库。那么谁的修改将被保存?Alice还是Jone?又或是都不?还是结合了两者的。

开发者对有连续访问的共享数据使用锁。那么究竟该选择什么样的锁方案 —— 乐观或者悲观?

在看Don Pinto带来的乐观锁与悲观锁的区别以及选用建议之前,先简单介绍一下他的履历:Don Pinto,现任Couchbase产品市场经理;曾担任微软SQL Server和SQL Azure项目经理;更早阶段还曾任职于IBM(DB2 LUW软件工程师)、Honeywell(软件开发者)等公司。下面先看看乐观锁与悲观锁的区别:

乐观锁

如果我们需要建立一个在线的百科 —— 使用Couchbase Server的应用程序:用户可以修改和添加文章。假设一下Alice正在使用应用程序对“bicycles”上的一篇文章进行编辑(修改一些信息),但是在保存前Alice忽然想起一些其它的事情并离开了电脑;就在这个时候Joe也注意到了“bicycles”文章上的相同错误并且准备纠正。

如果应用程序中使用的是乐观锁,Joe就可以编辑文章并保存修改。当Alice返回并准备保存修改的时候,那么不管是Alice或者是应用程序都希望知道文档的最新状态 —— 在Alice修改文档的行动得到允许前。乐观锁的出发点在于该数据很少会因为并发修改而产生冲突,所以并发修改显得更重要一点。

悲观锁

这里不防设想一下你的业务流程需要互斥存取一个或多个文档(又或是一个graph中的文档)。参照上面的例子:当Alice正在编辑文档的时,她不想其他的用户对相同的文档进行编辑。如果这时Joe再去做同样的事情,那么他必须等待直到Alice释放锁。

通过使用悲观锁,应用程序可以实现对文档的单独占有。当用户完成文档的访问后,可以手动或者设置超时来释放锁。

那么究竟该选用什么类型的锁?这里是没有确切的答案的,因为使用什么样的锁该由具体情况决定。你需要根据你应用程序的需求选择相应类型的锁

除非你认为一个文档会存在重度的竞争,乐观锁的开销要远低于悲观锁—— 夺取你需要的,迅速做出修改并保存。如果被系统中其他人抢夺,你只能继续尝试直到成功。

使用了悲观锁,你可以对一个指定的项目进行互斥存取 —— 当它被锁定时,其它的线程都不可以访问。这里的关键在于悲观锁在操作失败后必须得到释放。想象一下:你已经获得了对象A,但获得对象B之前你不想放弃对象A;但是另一个已经获得了对象B的用户,在获得对象A之前也不想放弃对象B。那么这时候就需要用到超时设置,它可以打破死锁和处理释放锁失败的情况。

简而起见,用户通常会在整个应用程序中使用相同的锁策略。如果在整个应用程序中都有着同样的需求,这么做也无可非议。事实上,情况不是这样的 —— 不同的应用程序对象有着不同的访问需求。下面看一下社交游戏中的两个例子:

  • 角色和玩家的信息在游戏期间被频繁的访问,这就需要快速的读写访问。第一选择 —— 使用乐观锁。第二选择 —— 悲观锁。
  • 用户的账号和参数只在用户登录或者是游戏开始的时候才会被读入,并且不会被频繁的修改。那么乐观锁在这里同样会有很好的表现。

在Couchbase Server中获得悲观锁

  • 使用get-and-lock API获得检索给定键的值,并进行锁定
  • 应用现在已经拥有了对该文档的互斥控制

在Couchbase Server中获得乐观锁

这里需要使用check-and-set(CAS)API获得CAS的版本号。

释放Couchbase Server中的锁

这里需要使用CAS来修改并释放锁

解读CAS

CAS操作是一个很简单的理念用以建立更卓越的并发性控制机构。CAS会在对一个对象进行读入和尝试保存时确认这个对象是否被其他的用户更改 —— 如果对象被另一个用户更改,那么错误将会产生而应用程序必须重新读取对象的值并重试操作。如果对象不存在高度争夺,那么数据的转换将是幂等的;而重试操作也会在不浪费太多的工作下完成,一般情况下乐观锁会是一个拥有高性能的解决方案。

与CAS的交互涉及到一个GAS回路,点击查看详情。

举个例子:下面交互图中存在的3个用户。他们3个都在使用CAS尝试去更改X对象 —— 每个客户端都成功,但是一次只有一个。

你并不需要释放锁,吩咐Couchbase就好了

当你做一个get-and-lock的操作时,你提供一个值作为锁的参数。一个键默认会被锁定15秒。15秒过后,如果你还没有手动的释放锁,那么Couchbase会自动的为你释放。

最终的见解

当然不是在所有的情况下,乐观锁都是最好的解决方案。在许多用例中乐观锁可能会有很好的表现,但在其它情况下可能就会需要像悲观锁这样更严格的方案。

当然锁也不是适合所有的情况 —— 如果出现锁竞争,你的应用程序可能就会抛锚。如果一个线程已经获得了一个锁,而OS又没有对这个锁的安排;那么其他想争用这个锁的线程将会被阻塞。当然其中的一个选择就是避免完全加锁,尽量的使用原子操作。这些API对存在高度竞争的数据是很有效的。

原文虽确定了Couchbase Server这个使用背景,但是有些思想和API还是值得借鉴的。

原文链接:Optimistic or pessimistic locking - Which one should you pick?  (编译/仲浩 审校/包研)

欢迎关注@CSDN云计算微博,了解更多云信息。

中国 vs. 非洲:移动医疗的前世今生 Java大数据框架初创企业Concurrent获400万美元融资 基于Edge Animate开发CSS3 Animations 后端服务商Firebase发布全新iOS SDK [爆料]百度云或在秘密打造实时移动Web App开发框架 打造最佳开发团队的几点建议 Facebook与开发者交恶 扼杀第三方应用 负载大逃亡:四十二路怪兽联军及七条逃生法则 那些年,MIT技术男们奇妙的黑客作品 深度分析:腾讯3.3亿美元收购Epic股份值吗? 传下一代iOS或将推行扁平化设计 iOS开发者注意:苹果将拒绝访问UDID的应用上架 领先Google、Amazon、Dropbox,Apple云存储用户最多 传IBM重新设计晶体管 预计五至七年内成熟 快讯:云计算大会6月召开 云计算概念企业股票飙升 集成开发环境:Qt Creator 2.7.0发布 移动周报:“今日头条”CEO,爱冒险的技术宅 从China Daily的iPad版,看中国纸媒如何摆脱“旧情结” 天睿推出大数据探索平台:“开箱即用”的数据分析 Basho开源Riak CS,与AWS S3兼容的云存储架构 MongoDB Days北京杂记 VMware携手亿阳信通 铺垫混合服务 行业应用,移动优先:移动难七大痛点剖析 HTML5开发必备:游戏开发资源合集 老而弥坚:65岁传奇Android工程师谈开发 2013中国云计算有奖大调查,每周大奖等你拿! Google Reader之死另一个不为人知的原因 小团队谈推广:豆果、金山、微博易、面包旅行 敏捷实战:如何让团队迭代交付周期缩短一半 移动设备管理初创公司AirWatch:首轮融资2亿美元 New Relic:不等应用崩溃,实时监控你的App! 帮帮忙,我急需有关ERWIN的书籍资料,请能在哪里下载?急啊!先说声谢谢! 500分求助!!!如何打印MSCHART控件画出的折线图 请问网上有没有关于UI线程比较好的例子?如果有的话,发一个网址给我,在线等待,谢了! 一道选择题 局域网,一方可以ping通一方,怎么解决?? 装了WIN2K后,如何再装LIUNIX实现双启动? TQuery的简单用法,高分大放送! 如何将controls对话框中不用的控件去掉 请问怎么用coff2omf,把Strmiids.lib、Quartz.lib、Strmbase.lib转化成BCB可以接受的格式 JDBC for mysql 的使用 -------问题 偶有重回delphi修炼了,当年偶的师傅还在吗?老千,老鱼,chech,小新,老鬼,你们过的怎样?? 你现在正在看的这种页面如何实现? 我很喜欢delphi,但老板要我转学单片机,请兄弟们说几句,是福是祸?up、gz有分! vb的安装问题 请问如何在两个数据库之间进行联合查询? 迷 !!!!!! 天使的旁边是魔鬼 数据集排序问题 哪里有 MS viso 下载,谢! 用DATAREPORT设计报表,这个怎样设计? ASP写的计数器程序问题 天女散分:process basename 中文叫什么,进程什么名? 数据库句柄清除问题 请问我用JBuilder + weblogic61 编写的 EJB,在我拿到别的地方部署,是不是只拿 XEjb.jar和客户端 就行了? 如何让两个byte类型的变量a和b进行异或(^)操作,然后将结果存入另一个byte中? 我也来一个关于ACCESS的问题,高分请教。在线等待 CDC问题:怎样从屏幕尺寸转换到厘米呢?反之呢? VC中如何给动态产生的控件写事件方法?在线等! 》》怎么没有人解决这个问题呀,谁解决,我给分!!!!! 为什么快捷方式不能用? ★★★有没有像“delphi属性编辑框”一样的控件或是源码(100-1000分)★★★ 谁有RealPlay格式详细信息 500分求救! 请问大家那里有jrun 4下载 如何自己析构单文档模板? MASM32中标号的疑问 这个错误该如何改 关于在OUTLOOK中如何自创模板的问题? com系列丛书那里有卖 一个关于鼠标事件的简单问题 为什么我在JSP中能得到TEXT文本中的数据,却得不到在SELECT中的数据呢? 求救!为什么我的ACESS数据库文件会莫名其妙的达到25M,我还没输任何数据呢?而生成MDE后只有500K? 我要一个功能强大的弹出日历 Viva La Costa Rica! 我再也不看Chinese Team的比赛了! 如何做jar包呢?还有如何做bak呢?大家救救我吧。 《inside the c++ object model》问题 这句是什么意思??? 问一个Win2000Server域用户客户端登陆问题。 小问题:在线等待:) 如何删除一个ini文件中的关键项目?急 求救!为什么我的ACESS数据库文件会莫名其妙的达到25M,我还没输任何数据呢?而生成MDE后只有500K? 秦朝灭亡后西汉建立前这段时间叫什么?为何字典上不记载这一时间段?当时是项羽的势力最大吗?为何他不改国号 化学问题H2S和NaOH反应生成什么?H2S和NaOH反应生成什么?几种情况都写下过量和不足H2Na只是一个还有什么情况 什么是石灰是熟化?生石灰熟化方法有那两种? 在KCl和CaCl2所组成的混合物中,KCl和CaCl2的物质的量的比为2比1,求1mol氯离子的该混合物的质量? H2S和氢氧化钠反应...为什么H2S和氢氧化钠反应生成的不是盐和水? 宗法制为什么是分封制中的血缘纽带?宗法制为什么是分封制的政治体现形式? 同学为证明NaOH溶液与稀盐酸发生了中和反应,从不同角度设计了如下方案,进行实验.方案一:先用PH试纸测定NaOH溶液的PH,再滴加盐酸,并不断振荡溶液,同时测定混合溶液的PH,如果(1)简述“强 周朝建立时,世界各国都处在什么阶段 为什么说分封制是宗法制在政治制度方面的体现?难道宗法制不是政治制度吗? 请大家来看看 这是个什么昆虫,叫什么名字,好漂亮哦 H2S + NAOH = 为了方便回答者准确理解,请您对问题标题或内容进行补充 秦朝郡县制郡与县的关系是什么?如题.郡县存在隶属关系吗?哪个大那个小?直接搜到就往上粘的答案就算了,表浪费我流量,回答满意给全分哦 韩国灭亡时间周朝啊 周朝是由谁所建立的啊? 我国传统经济发展方式是什么? 周朝时候.“中国”指什么A是周天子的直辖地区 B中原地区 C华夏族的诸侯国 D首都 是谁建立的周朝 向久置的氢氧化钠溶液中加入稀盐酸 怎么反应?久置的氢氧化钠 是全部变质还是部分变质?、 周朝的建立时间回答 大禹是周朝的建立者吗 写出稀盐酸与氢氧化钠溶液反应的化学方程式是什么?. 在KCl和CaCl2所组成的某混合物中,K离子和Ca离子的物质的量之比为2:1,则该混合物中含CaCl2的质量分数为 只求最后一空,要详细的阶段过程. 向一定量的氢氧化钠溶液中加入一定量的稀盐酸后,混合液PH范围取混合溶液滴加酚酞试液,溶液无色,能否证明酸碱中恰好反应,理由 如要证明上述酸碱之间确实发生了反应,这混合溶液的PH值范 稀盐酸和氢氧化钠溶液能反应吗?现象是什么? 在KCl和CaCl2的混合物中K离子和Ca离子物质的量之比2:1,则该混合物中含CaCl2的质量分数为___,含1molCl离子的该混合物的质量是__g(写出过程) 现在又 KCL和CaCL2 组成的某混合物,其中K+ 和Ca+ 的物质的量之比为2:1若将该混合物溶于水得到500ML溶液.且 C(K+)为1.0MOL/L(1) 含有1MOL CL- 的该固体混合物的质量为?CL- 物质的量浓度为?溶液中 氢氧化钠溶液能够与稀盐酸反应的理由RT kcl,cacl2组成的某种混合溶液中,k离子与ca离子物质的量之比2:1,求混合物中cacl2的质量分数? 在KCl和CaCl2的混合物中,K+和Ca2+物质的量之比为2︰1则该混合物中含CaCl2的质量分数为__________,含1mol Cl-的该混合物的质量是__________g.思路清晰一点, 向久置的氢氧化钠溶液中加入稀盐酸 怎么反应?久置的氢氧化钠 是全部变质还是部分变质?、 在KCl和CaCl2的混合溶液中K离子Ca离子的物质的量之比为2比1,KCl和CaCl2的物质的量之比为?质量之比为?还有一问,若要取出1mol氯离子的该混合物,应取该混合物的质量为? 生石灰加水熟化会有什么现象产生?生石灰在使用前为什么要陈伏两周以上?为什么陈伏时需在表面保留一层水? 血缘关系维系的宗法制的内容 工地上使用生石灰时,为什么要进行熟化?熟化时,为什么必须进行陈伏? 贞观之治,文景之治,开元盛世,康乾盛世的皇帝分别是谁? 了解宗法制和分封制的基本内容,认识中国早期政治制度的特点1.宗族关系从此成为基本的政治关系开始于______(朝代)2.商代贵族以血缘关系为纽带,实行_____,各个宗族都是政治实体.商代政治 中国历史上的盛世有多少个?到底哪个最“盛”?比如,仁宣之治,康乾盛世,贞观之治. 生石灰熟化的体积膨胀系数与生石灰块沫比之间的关系? “宗法制衰落的实质是政治关系中的地缘关系取代血缘关系”怎么理解? 盛世的内涵? 中国历史上有哪些盛世 从文景之治,贞观之治,开元盛世中得到什么启示? 宗法制得以维系的重要因素是血缘关系的题目9.宗法制得以维系的重要因素是血缘关系.最能证明这一点的材料是( )A.孔子说:“周因于殷礼,所损益,可知也……” B.《说文解字》载: 中国历史上的盛世之治有哪些?比如:贞观之治开元盛世等......只列举名称和朝代即可 在我国古代历史上曾出现过许多经济繁荣的时期,如文景之治、贞观之治、开元盛世等等.它们能够出现的共在我国古代历史上曾出现过许多经济繁荣的时期,如文景之治、贞观之治、开元盛世 浓醋酸加水和冰醋酸加水导电能力变化有什么区别吗? 中国历史上有哪些盛世 理解文景之治,贞观之治,开元盛世出现的原因和意义 冰醋酸加水稀释时为什么导电能力是0 生石灰熟化时为什么必须进行陈伏 秦朝是怎么灭亡的?四个小问题:1.秦始皇何时登基,在位多少年?2.秦朝用了多长时间灭六国最后统一全国,秦朝统治持续了多少年?3.秦始皇怎么死的,死后由谁继位,秦朝最终是怎么灭亡的?4.秦朝 向一定质量的冰醋酸中加水,导电能力先增后减.老师讲的是最初电离占主导因素,加水电离增大,离子浓度增大,导电能力增大.然后溶解完后,加水在稀释溶液,整体离子浓度减小,导电能力减弱.我 请问中国历史上41个盛世是哪41个我想说的是 我只是初中生 目前我总结出来的有27个真心想不出来了 只是这次期末考试要写四个我在试题纸上写了27个在那边选 但我看到说有41个我很好奇剩 在kcl和CaCl2所组成的某混合物中,K+和Ca2+的物质的量之比为2:1,该物质混和物中CaCl2的质量分数为多少,KCl和CaCl2的物质的量之比为多少,含1molCl-的该混和物的质量是多少g? 人吃了水银会怎么样 一般的通讯干燥剂,哪有的卖? 如何将块状生石灰熟化成石灰膏? 在kcl和cacl2所组成的某混合物中,k+与ca2+的物质的量的比为2:1,则该混合物中含cacl2的质量分数为 ,kcl与cacl2的物质的量的比为 ,含1molcl-的该混合物的质量是 克. 从秦朝灭亡至西汉建立,其间到底发生了什么 H2S和NaOH如何反应如题 在KCl和CaCl2组成的某混合物中,K+和Ca2+的物质的量的比是2:1,则KCl与CaCl2的物质的量之比是?能否告诉我为什么是2;1?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘