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

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

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如何结束 Shell 所启动的程序? VB如何拦截键盘输入 如何判定VB调用的一个EXE程序已经结束. VB如何判断某一个Drive是否为光碟机? VB如何清空回收站? VB如何取得汉字的区位码 VB如何去优化你的VB程序 VB如何让点阵打印机每次印出一行? VB如何设计一个可中断循环的按钮。 VB如何实现VB程序登录密码加密 VB如何使程序不出现在任务列表中 VB如何使键盘、Mouse失效(JournalPlayBack Hook) VB如何使用 DBGrid VB如何突破 TextBox 32K 的限制? VB如何为执行程序加上参数? VB如何压缩较长的全路径文件名中的路径 (Path) 字串长度? VB如何在VB中实现密码的读取 如何在VB中使用命令行参数 VB如何在内存中的指定位置取数据? VB如何在已经存在的文本的textbox添加新的一行 VB如何在資料庫中存入單引號? VB如何正确使用VB6访问Access2000数据库 VB如何自动记录计算机开机时间? VB如何做到当我们单击窗体的最小化和关闭按钮时,窗体先最小化到任务栏成为按钮,然后消失呢?金山词霸能 软件工程篇-Const与#Const的对比 -VB资料 软件工程篇-从Visual Data Manager开始 -VB资料 软件工程篇-理解错误处理代理 -VB资料 软件工程篇-清空集合内容的几种方法 -VB资料 软件工程篇-受限制的共享软件Shareware -VB资料 设定CapsLock ScrollLock NumLock-VB资料 设置计算机名称-VB资料 VB.NET的两个简单问题??? not enough free disk space on /tmp,这个问题如何解决,(100分) 急寻:中缀和后缀表达式互转的源代码。 请问这个页面如何实现的..... 简单问题,在线等待中... 百分求购事务处理!! 用ATL写了一个com组件,在客户端怎么调用它呢? 请问如何取得USB摄像头和普通麦克的数据,怎样将已得到的视频音频数据在终端上播放 如何让WAS和Tomcat一样,运行JSP/SERVLET的时候出现错误进行提示? 用JDBC连接SQL Server 2000数据库问题?在线等待... 弹出式菜单的问题 各位大侠,寻求帮助,急!急! c语言类中的私有和公有变量在汇编中怎么表示? 关于EJB测试的问题 谁能给个错误处理的例子 比如 SQLSERVER 数据库关闭时 返回 “数据库关闭“ 的信息 部分匹配的问题 英文版XP中文显示问题 oracle,用PreparedStatement更新数据库,date型字段精确到分,应该如何操作? 数据导入的问题 有正义感的高手进来帮忙,干掉我设计的网站吧!在此不盛感激,同时也代表天下IT民工谢谢。 开始学PHP的菜鸟说:我现在用一个支持PHP的空间。比如XXX.PHP就可以用。我想用数据库。怎么连接呢?我可以把数据库放到自己的目录下用数 送分 我用的是:无惧上传类 Version V1.2 ,但是,程序执行后无出错提示,担找不到上传的文件,什么原因,那位朋友邦忙解决一下. 使用“POPTEN新闻管理系统”为什么不能上传图片呀? 小弟想学习EJB,不知道那本书较好? 测试过程 请问: 如果将数据分页里的复选框全选,并将每个复选框得到的ID插入另一张表。?? 关于Adodb+DataGrid的配合使用问题,高手请进! ★ ★我想在资源管理器窗口上 再加上一个Toolbar,(我看到过有些软件做到了,而且添加的Toolbar中还有启动程序的按钮),请问怎样可以做到 请教:“纳入基线” vs.net的水晶报表连接oracle,但找不到表,什么问题?很急啊!!! 关于float,double类型的数据四舍五入的讨论! 有无软件或OS可实现一台强大的电脑带多套外设?(N多键盘、鼠标) 请问如何正确配置和使用第三方开发包阿? 触发一个已封装好的程序 根据textbox内容查询数据库怎么写? 内存访问错误,参与者有分! 如何在类中创建一个其它类对象的数组? 急!不用数据窗口的事务处理!150 excel导入sqlserver 请问层如何显示在控件之上(比如select)? 多CPU下的SQLSERVER问题 散分,只为了心中郁闷! 100分狂送:你了解 福建实达电脑设备公司应用软件部??? 特殊需求的数据库备份 如何将C#写好的程序用。NET打包可以安装? 有谁能给个客户端能自动探测10000端口上是否有信息,并提示! 暴奇怪的打印问题:同一程序,在右边机子上打印正常,左边不行了,而且问题奇怪!!!! 请问知道了一个ip在ping自己的机子,有什么办法可以知道他的计算机名的啊? 测试高手请进 请问如何获取优盘的系列号 定积分问题,第一步到第二步是怎么变的? (x-4)^2+y^2=16 ,(x+2)^2+(y-2)^2=8 求x,y 荡胸生层云,后面句是啥? 荡胸生层云中荡怎么读 要有关做客的不要写到谁家做客表妹表姐对我怎么样的,就写有关做客的 若方程(a-2)x=b+3的解为a-2分之b+3则结论为什么若方程(a-2)x=b+3的解为a-2分之b+3则结论为什么 A.a>b b.a≠2,b≠-3c.a≠2,b为任意数 d.a<b 寒假的生活作文、字数在400以上700一下最好了~… 等比数列前5项和=10,前10项和 =50,则前15项和多少 f(f(x))=x^2+x,求f(x)解析式. 等比数列前三项和为15求通项 没其它条件了 求救啊 . 问一道【定积分】的题目:∫[下限0上限3]2^xlnxdx麻烦详细点,我今年才高二...= = 澳新州消防部门提醒当地居民撤离以应对妻子选总统 洪都拉斯被罢黜总统或可重QQ群里热聊\"如何结束生命\" 2浙江省新增1例人感染H7N9禽流感病美“天鹅座”货运飞船与国际空间站对接中亚论坛专家学者呼吁加强双边多边务实外交部:中方欢迎苏丹、南苏丹就多项议报告显示澳洲1/4家庭中女性开始养家印度一农民家园遭洪灾破坏 政府仅给一中泰战略合作新契机或在高铁合建柬专家认为中国-东盟自贸区升级有利双安倍再次未敢“拜鬼”上海:男子因感情纠纷上门杀害女友父女全面做好对口帮扶遵义工作俄军最先进洲际导弹曝光可穿透所有反导给点自主权好不好老人躺着,银行服务也“躺着”?上海率先“网晒”行政复议书森林花海十年播种 爱心深植母校试水网络理财 苏宁布局“全金融”南京市长季建业涉嫌违纪违法正接受调查
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘