Optimistic Offline Lock乐观离线锁
- 通过冲突检测和(发生冲突时的)事务回滚,来防止并发业务事务中的冲突.

- 通常一个业务事务的执行,会跨越一系列的系统事务.
- 一旦超出了单个系统事务的范围,就不能仅依靠DB管理程序来保证数据一致性.
- 乐观离线锁
- 假设冲突的发生可能性很小.
- 使多用户并发地对同一份数据进行处理成为可能.
- 在同一业务事务中,进行预验证和对数据的修改.
- 一个成功的预验证可以视为得到一个锁,来表示能够成功地完成对数据的修改.
- 运行机制
- 原理:通过检查在(业务事务)会话读取一条记录后,没有其它的会话修改该记录来保证数据的一致性.
- 可以在任何时间获取该锁,但是它只在获得该所的系统事务过程中有效.
- 系统事务中只有有对DB的修改,就需对每个变更成员申请该锁.
- 实现
- 为每条记录关联一个Version.
- 在加载记录时,由会话本身来维护版本号.
- 获取锁的动作,就是将会话数据中的版本号与DB中记录当前的版本号进行对比.验证成功时,所有变化(包括版本号的增加)可以提交.
- 通过增加版本号来避免不一致的记录.使用旧版本号的会话无法获得乐观离线锁.
- 一条SQL语句就可以同时获取锁(根据会话的版本号来检索DB)和更新数据.
- 通过检查SQL执行结果返回的行数得知是否成功.1代表成功.0代表记录被更改或删除.
- 不成功时,要么取消业务事务,要么解决冲突并重试.
- 除了Version,还可以附加上一下最后修改该记录的信息(Who,When).以便于冲突发生时的管理.
- 在更新时的SQL语句中的where子句中包含对所有字段的检查.
- 好处是不用增加版本号字段.
- 但是造成了很长的where语句.损害性能.
- 当事务只依赖于一个数据行的存在与否,或者仅是其中的一个字段.那么更应该使用条件判断而不是版本控制来提供灵活性.
- 一个更简单的方式是把业务事务的所有步骤放在一个长的DB事务中.
- 企业应用中的并发管理更是一个领域问题,而不是技术上的问题.
- 乐观离线锁的实例:SCM
- 当SCM检测到冲突时,会自动合并修改并重新提交.
- 所以,配合了高效的合并策略后,乐观离线锁会更加的强大.
- 在企业应用中,合并业务数据需要特殊的代码处理.
- 该锁只会在最后的提交阶段时报告冲突.
- 可以在之前的步骤中checkcurrent()来预判别人是否更改了数据.
- 为每条记录关联一个Version.
- 使用时机
- 业务事务的冲突率很低时.
- 并发管理的目标是尽可能增加对数据的并发访问,同时减少冲突.
- 所以,应考虑的是光有乐观锁是不是还不够.需不需要补充上悲观离线锁.
Optimistic Offline Lock乐观离线锁的更多相关文章
- Pessimistic Offline Lock悲观离线锁
每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突. 离线并发处理通常会出现多个业务事务操作同一数据. 最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务. 首选乐 ...
- [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较
转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...
- Catalog of Patterns of Enterprise Application Architecture
Catalog of Patterns of Enterprise Application Architecture Last Significant Update: January 2003 A s ...
- Coarse-Grained lock 粗粒度锁
用一个锁Lock一组相关的对象 有时,需要按组来修改多个对象. 这样,在需要锁住其中一个的时候,必须连带地将其他的对象都上锁. 为每一个对象都加上一个锁是很繁琐的. 粗粒度锁是覆盖多个对象的单个锁. ...
- SQL Server 锁机制 悲观锁 乐观锁 实测解析
先引入一些概念,直接Copy其他Blogs中的,我就不单独写了. 一.为什么会有锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 1.丢失更新 A,B两个用户读同一数据并进行修改,其中 ...
- Pessimistic and Optimistic locking
事务隔离通常通过锁定任何对事务中资源的访问来实现的.总的来说,有两种方法针对事务的锁定:乐观锁(Pessimistic locking)和悲观锁(Optimistic locking) 悲观锁(Pes ...
- SQL SERVER锁(LOCK)知识及锁应用
提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的 ...
- 【转】锁(lock)知识及锁应用
sql server锁(lock)知识及锁应用转自:http://blog.csdn.net/huwei2003/article/details/4047191 关键词:锁提示,锁应用 提示:这里所摘 ...
- In-Memory:内存优化表的事务处理
内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...
随机推荐
- DirectSound的应用
假设仅仅使用PlaySound()这个API函数来表现声音效果的话,那么就无法表现出声音的混音效果,由于PlaySound在播放还有一个声音时,必定会导致现有声音的停止.因此,使用 PlaySound ...
- VMWare虚拟机网络的三种工作模式
VMWare提供了三种工作模式: 1.bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,需要手工为虚拟系 ...
- 微信公共服务平台开发(.Net 的实现)7-------发送图文消息
之前我们讲过让微信发送给我们普通的文本信息,下面我们来看看如何发送图文信息,需要注意的是这里说的是,让微信发给我们,而不是我们拍个图片发给微信处理,我们上传图片在以后的章节介绍.下面是发送图文消息的函 ...
- MySQL Cluster 4个数据节点压力测试--mysqlslap工具压400W写
锅巴哥的个人建议:cluster叫电信运营商版本,所以基本上在很大的用户并发量的情况下才会用到,对连接数的线性增长要求高的场景,千兆就不用想了, 没万兆就不用玩了. 很不幸,我的就是千兆网络,我的数据 ...
- iOS 2D绘图详解(Quartz 2D)之阴影和渐变(Shadow,Gradient)
前言:这个系列写道这里已经是第五篇了,本文会介绍下阴影和渐变的基础知识,以及一些基本的Demo Code展示,应该还会有两篇,介绍下Bitmap绘制以及Pattern等知识. Shadow shado ...
- 使用@media实现IE hack的方法
文章简介:众所周知,有些时候为了实现IE下的某些效果与现代浏览器一致,我们不得不使用一些hack手段来实现目的.比如说使用“\0”,“\”和“\9”来仅让IE某些版本识别,而对于现代浏览器来说,他会直 ...
- 终端I/O之特殊输入字符
POSIX.1定义了11个在输入时作特殊处理的字符.实现定义了另外一些特殊字符.表18-6摘要列出了这些特殊字符. 表18-6 终端特殊输入字符 在POSIX.1的11个特殊字符中,可将其中9个更改为 ...
- 基于jQuery上下切换的焦点图—带缩略图悬浮
分享一款基于jQuery上下切换的焦点图,这款焦点图带有缩略图悬浮,它的切换效果比较简单,仅仅是作图片的上下切换,但是效果还是比较流畅的.这款jQuery焦点图插件的另外一个特点是在播放器上面可以悬浮 ...
- ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...
- nodejs的mysql模块学习(六)连接池的创建和使用
介绍 在 软件工程 , 连接池 是一个 高速缓存 的 数据库连接 维持,使得连接可以当需要将来向数据库请求重复使用. [ 来源请求 ] 连接池用于提高数据库上执行命令的性能. 打开并保持每个用户的数据 ...