利用CAS原理处理修改操作的分布式事务控制

helencoder 2010-05-01

1.CAS

CPU指令和程序并发原语中存在CAS概念,CompareandSet,就是修改一个寄存器区域或变量值时,先检查oldvalue,oldvalue相同再进行修改,否则放弃。

例如:

已知inta=1;

引用
   非 CAS 赋值为:  a = 10;

CAS赋值为compareAndSet(1,10);

这样,在多线程并发操作时,最终a将被原子性的修改,而不会发生冲突的结果。

而数据库的事务中并发冲突的场景与之非常类似,都是对共享资源竞争访问时的突出问题。

2.基于CAS机制的数据库update操作

由CAS的原理,可以考虑以类似的方式处理数据库的update操作。

假定订单OD_0100的总价款为1100元,现在要将其修改为1500元,

引用
   update sale_order set order_amount = 1500.00

whereorder_id='OD_0100'

采用CAS机制进行修改,假定已经知道订单修改前的总价款1100,则updateSQL为

引用

updatesale_ordersetorder_amount=1500.00

whereorder_id='OD_0100'

andorder_amount=1100.00

若出现并发冲突,例如:order_amount已经先其他请求修改为900,那么上面的update语句的操作结果数为0;此时,客户端需要重新查询订单,再尝试第二次修改。这类似于CAS中的自旋。

3.与其他事务机制比较

数据库事务有悲观锁和乐观锁,乐观锁有一种机制是基于version字段来控制并发修改冲突。

与version事务机制类似,CAS事务也是一种细粒度的锁。然而,version为行级锁,粒度过大;而CAS事务为列级锁,粒度更小。根据锁机制的一般原则,粒度越小,并发性能越高。

相关推荐

xusong / 0评论 2012-05-29