乐观并发控制

乐观并发控制(optimistic concurrency control, OCC)


乐观并发是一个应用于事务系统(eg,关系型数据库管理系统与软件内存事务)的并发控制方法。

OCC假设大多数的事务可以在不互相干扰的情况下完成。

当事务运行时,事务不需要申请资源的锁,便可以使用这些资源。

在提交之前,每一个事务都会验证没有其他的事务修改了它所读取的数据。

如果检测显式存在冲突修改,提交事务将被回卷并重新开始执行。

 

OCC通常用于低数据争夺的环境下。当冲突较少时,事务的完成将会没有管理锁的消耗,并且不需要令事务等待其他的事务锁释放,其结果导致比其他的并发控制方法有着更高的吞吐量。

然而,如果数据资源争夺较为频繁,反复重启事务的花费将会极大地伤害性能,通常认为在这种情况下,其他并发控制方法拥有更好的性能。

但是,基于锁(悲观)的方法也可能造成糟糕的性能,因为即使死锁被避免,锁也会极大地限制有效的并发。

 

 

OCC阶段


更具体地说,OCC事务涉及以下阶段:

开始:记录事务开始的时间戳。

修改:读取数据库值,暂时写变化。

验证:检查其他的事务是否修改了当前事务使用的数据。这包括在当前事务开始时间之后完成的事务,可能包括在验证期间仍保持活跃的事务。

提交/回卷:如果没有冲突,所有的改变生效。如果产生了冲突,解决它,通常是终止事务,尽管其他解决方法仍然可能。必须注意避免TOCTTOU bug,特别是,如果此阶段与之前的阶段并不是作为单个原子操作执行。

 

 

Web用法


HTTP的无状态特性使得对于web用户接口锁机制不可行。

用户开始编辑一条记录,然后在不遵守取消或注销链接的情况下离开是比较常见的。

如果锁机制被应用,其他试图编辑相同记录的用户必须等待第一个用户的锁超时。

 

HTTP提供了一个内置OCC形式:

GET方法对于一个资源返回一个ETag,随后的PUT方法在If-Match头部中使用这个ETag值。

当一个PUT成功,第二个将会失败,因为If-Match中的值基于当前资源的第一个版本。

 

一些数据库管理系统在本地提供了OCC,从而不需要特定的应用代码。

其他的一些数据库,应用可以在数据库之外实现OCC层,用于避免等待或默默重写记录。

在这种情况下,表达将包括一个隐藏字段,内含记录原始内容,时间戳,序列号或一个不透明令牌。

在提交之后,这将与数据库进行比较。如果不同,冲突解决将会被调用。

 

 

 


翻译源:维基百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值