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

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

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云计算微博,了解更多云信息。

VB编写键盘拦截程序 VB常见问题解答(1) VB程序中处理随机事件 VB的多媒体控件VBPLAY.VBX简介 VB技巧点滴 VB技巧汇编 (一) VB剪贴板的用法 VB开发CAI软件的小经验 VB软件设计中的几个问题 VB新手常见问题解答 VB修改注册表一特例 VB与VC混合编程中处理消息的方法 VB中的进制转换是怎样的? VB中调用带参数存储过程的实现(数据库) VB中感叹号“!”与圆点“.”的用法差异 VB中如何实现注册表的读写 VB中实现“擦视”技术 Visual Basic 2000年问题 Visual Basic 的未来 Visual Basic 命令分类表 Visual Basic三级跳 Visual Basic使用技巧 Visual Basic中的子类处理技术 Visual Basic中软件封面技术探秘 VisualBasic 软件设计中的几个问题 Windows 95/NT 运行了多长时间 -VB资料 Windows 的登录资料库 -VB资料 把回车键变成TAB键-VB资料 把文件置入到Text或RichText中 -VB资料 避免按 [ENTER] 回车键产生的“嘀”声 -VB资料 避免使用全局变量-VB资料 c怎样访问数据库啊?一定给分! from里的参数传递为ENCTYPE="multipart/form-data"时的问题? 网吧问题 如何在txt文件中查找字符 请问如何实现当进入一个combox时自动下拉列表框(不用用鼠标去点) 关于volatile 修饰词 过去用Delphi开发数据库都是用Access,现在急需使用SQL Server。请问:我必须掌握SQL Server中的那些内容。 如果我想删除日志文件的所有记录该怎么办?????? 怎么样把两个ArrayList合并成一个??我在文档里找了半天也没找到!急~~!!!!!!! 请问,NT4.0下怎样配置网关和路由? 请问如何知道一个弹出菜单是否以经关闭 升级后问题,奇怪,请指教? 什么是存储过程? 大侠们帮忙看看,简单问题 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169. 请问怎样才能在Access中选取指定行数的记录如第5-10条. 关于XML命名空间的疑问?请教各位高手帮帮忙!谢谢! 请问哪里有《情深深雨蒙蒙》下载??? ******斑竹快出来啊 看看我这个贴子啊!!!!!!!!!!!!!! 如何读取寄存器中的数据? 请问在数据库中如何操作日期型字段: Help,如何把本机加入主域服务器? 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169 怎么用vbscript定义一个函数阿。我想作一个下拉框的onchange事件,请指教 如何确定adoquery的数据是否被修改了? 有关程序调试的问题 全都转行卖大白菜。 对于各个.h和.cpp文件分工如何,我的各种函数各个变量到底该放在哪个文件中的哪个class中? 如何停止asp调用的dll文件,我调用my_dll.dll文件一次之后就不能对my_dll.dll更改了,为什么?怎样解决? 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169.. 关于附件下载过程中权限控制的问题 如何编辑LILO文件? 糊涂啦。。。看看汉字库(hzk24)吧? 请问在listbox控件中如何设置特定行的颜色? 问一个关于ODBC的问题 急:因出差,明天(12.20,第二期)的“微软.net高级程序员培训”转让(包括资料)!今晚6:00前联系,13910321169.... 各位大侠,哪有设计专家系统的c语言的源代码阿(全分奉送)? 请问:如何处理MFC提供的CList类模板产生的异常问题呢? 散分!快抢! 调用对象 阿呆,只有你能救我了~~!!!!! 100大洋~~!!! Excel报表的汇总 请问VC有像Delphi或者C++Builder那样的作报表的工具吗? delphi怎么调用CHM文件啊? win98 登陆win nt Java远程调用的合法类型(legal types for Java RMI)都有哪些? 安装盘的制作问题 如何设置多个Timer? VFP的程序怎么才能运行在任何目录下?主程序应该怎么写? 这个问题很老套,但对于一个什么想成为一个优秀程序员的菜鸟来说,很重要,谢谢!进入........... @_@ 怎么灌水? 向资深灌水工请教! 一个平行四边形,面积是九分之八平方米,高二米,这个平行四边形的底是多少米 等腰三角形面积怎么求 水平面上有一个物体受水平方向力的作用由静止开始无摩擦的运动,经过位移s1,速度达到v又经过位移s速度达到2v,则两段位移中该力所做功之比是多少? 告诉我大量关于三角形面积公式继续,不管常用不常用若有推到过程加分(除海伦公式,内切圆) 已知三角形ABC的面积是2008平方厘米,是平行四边形DEFC的四倍.求阴影部分的面积下面的图还没有收到答案 在水平面上有一个质量为M的物体,在水平力作用下由静止开始运动一段距离后,到达一斜面底端.这时撤去外力.物体冲上斜面,沿斜面上滑的最大距离和水平面上运动的距离相等,然后物体又沿斜 运送液体的车,液体最上方的中间有气泡,当车开动时,气泡向哪运动,刹车时气泡向哪运动 一个三角形和一个平行四边形的面积相等,底也相等,如果三角形的高是10米,那么平行四边形的高是()米,如果平行四边形的高是10米,那么三角形的高是()米. 在恒定力F作用下,物体由静止开始运动,经过一段位移s后,速度达到v,做功为w.在相同的恒定合力F作用下,物体的速度由0增至nv,则F做得功是原来的___倍,若要物体的速度由v增至nv,则需对它做的功 如图所示,一个装水的玻璃管中有一个气泡,当玻璃管突然向左运动时,气泡会向()运动,这是因为()具有惯性 要比例 水平地面上有一质量为10kg的物体,在50N水平力作用下由静止开始运动,6秒内位移为36m,6s末撤去这个水平力,则再经 s,前进 m距离物体停止运动.快 已知三角形三边求面积的公式是? 气泡水可以自己做么? 一个三角形有多少个角?如果在三角形中添画一条线段,会增加多少个小于180 度角?在添画一条线段呢一个三角形有多少个角?如果在三角形中添画一条线段,会增加多少个小于180度角?在添画一条 知道三角形三边怎样求面积?用什么公式? 小孩子吹的泡泡水怎样做? 一个三角形从一个角到对边引一条线分成2个三角形,问:有这个三角形共有几个角对边的那个平角算不? 一个平行四边形的面积是128平方分米,底是高的2倍,底是多少分米,高是多少分米? 一个三角形与一个平行四边形的面积和底都相等,平行四边形的高是4厘米,三角形的高是多少厘米? 长16厘米宽10厘米的长方形框架拉成一平行四边形,面积减少16平发厘米,那这平行四边形的高是多少厘米 写出一个一次函数的表达式,使其图像与两坐标轴围成的3角形面积等于3 泡泡枪的泡泡水怎么做?要求:做法简单,并且可以使用放心,对宝宝无害? 把一个面积是81平方厘米的正方形框架拉成一个平行四边形框架,面积减少了4.5平方厘 已知一次函数的图象经过点(2,2),它与两坐标轴所围成的三角形的面积等于1,求这个一次函数的表达式 玩具泡泡枪里的泡泡水怎么配 材料中的“气球小车”是被怎样推动的 已知一次函数的图像经过(2.2),它与坐标轴的三角形面积等于1,则这个一次函数表达式是 将面积是72平方厘米的长方形框架拉成一个平行四边形后,面积减少9平方厘米.已知将一个面积是72平方厘米的长方形框架拉成一个平行四边形,面积减少了9平方厘米,已知长方形框架的长时9 从n边形出发,连接其余各顶点,n边形有几个三角形. 一次函数Y=-2X+b的图像与两坐标轴所围成的三角形的面积等于4,求此一次函数表达式 把一个长9厘米,宽6厘米的长方形框架拉成一个平行四边形,这时面积减少了10平方厘米,求平行四边形的面积 桌上放一个装满水的瓶子,中间有一个气泡,用手推一下瓶子,气泡将会向哪边运动,为什么? 汽车有几种刹车,我就知道气刹和油刹.还有气刹和油刹原理? 如何自做泡泡水 水平放置的小瓶内装有水,其中有气泡,当瓶子从静止状态突然向右运动时,小气泡在瓶内将向何方运动?当瓶子向右匀速运动突然停止时,小气泡在瓶内又将如和运动? 汽车刹车分为机械刹车 油刹车 气刹车 电子刹车 请问现在哪些分别运用了这些系统? 自制泡泡水过程作文怎么写 把一个长10cm宽8cm的长方形的框架拉成一个平行四边形这时面积减少了12平方cm平行四边形的高是多少cm用方程解 1.一个平行四边形的高为5.6平方分米,若底不变,高增加1.7平方分米,面积就增加23.8平方分米,那么原面积?A.78.4 B.33.32 C.7.225(直接说答案)2.小明计算除法,把除数54写成45,得到商10,余数36,正确商 如何自制吹泡泡水?小孩子玩的吹泡泡的玩具,用一个圆圈形的工具沾上泡泡水一吹,就能吹出好多泡泡, 桌上放一个装满水的瓶子,中间有一个气泡,用手推一下瓶子,气泡将是向前,但是气泡有惯性呀,不是先向原来位置的方向吗拜托,瓶子是横放的 ,气泡在液面 一块平行四边形玻璃,面积是20平方米,底是高的5倍,这块玻璃的底对应的高是多少? 一个平行四边形面积是4点5平方分米底5分米高多少分米. 自制泡泡水怎么弄?怎么记得小时候肥皂水就可以了呢 一块平行四边形的玻璃,底长4cm,高比底短8分之1.这块玻璃的高是多少?面积是多少脑袋坏掉纯属随便乱发 一个平行四边形,若底不变,高减少3分米,面积就减少9平方分米.若高不变,底增加3分米,面积则增加15平方不能列方程 吹泡泡的水怎么自制 直角三角形的面积公式怎么计?左边的是7分米,右边有一条斜边的是9分米,底下的是4.8分米,怎么算,这个9用不用算? 下面图中的两个平行四边形的高相等,其中阴影部分的面积是4平方分米,底是2.平行四边形的高是4分米,图形的总面积是多少? 把一个长为8厘米、宽为6厘米的长方形框架拉成一个平行四边形,这时面积减少了8平方厘米.求平行四边形的边为8厘米的边上的高是多少厘米? 直角三角形计算公式已知2条边和一个直角有办法求出另一条边么 汽车盘式刹车的刹车皮材料是什么?能再细致点吗? 1.把一个长为8厘米、宽为6厘米的长方形框架拉成一个平行四边形,这时面积减少了8平方厘米.求平行四边形边求平行四边形边长为8厘米的边上的高是多少厘米? 运输液体货物的车,如果车厢中有一气泡,当车启动时,气泡为什么向前运动 汽车刹车盘和刹车皮那个贵我的车是老款九几年的现代索纳塔今天去换俩前轮刹车皮和刹车盘 修配厂出的配件价格是刹车皮原厂240元 副厂120元 刹车盘说是原厂但是没说价钱开始我要的都是 把一个长为8厘米,宽为6厘米的长方形框架拉成一个平行四边形,这时面积减少了8平方厘米.求平行四边形做边长为8厘米的边上高是多少厘米? 一张平行四边形材质的第一场八分之三米地势高的八分之五,这张平行四边形彩纸的面积是多少平方米? 等腰三角形的面积公式 只知腰长已知腰长为20厘米,求面积,求得出来吗 物体原来静止在水平地面上,在水平向东、大小不变的力作用下,物体做匀加速运动,经过一段位移到A点时速度为V.此时作用力方向不变、大小立即增大为原来的3倍,又经过同样大小的一段位移
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn