`
raymond2006k
  • 浏览: 290910 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
1. CAS
   CPU指令 和 程序并发原语中存在 CAS 概念, Compare and Set, 就是修改一个寄存器区域或变量值时,先检查 old value, old value相同再进行修改,否则放弃。
 
   例如:
   已知 int a = 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
   where order_id = 'OD_0100'


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

   update sale_order set order_amount = 1500.00
   where order_id = 'OD_0100'
     and order_amount = 1100.00

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

3. 与其他事务机制比较
  数据库事务有悲观锁和乐观锁,乐观锁有一种机制是基于 version 字段来控制并发修改冲突。
  与version事务机制类似,CAS事务也是一种细粒度的锁。然而,version 为行级锁,粒度过大; 而 CAS 事务为列级锁,粒度更小。 根据锁机制的一般原则,粒度越小,并发性能越高。

0
0
分享到:
评论
2 楼 dogstar 2010-12-15  
stm就是cas的库/语言级别的实现.
1 楼 mercyblitz 2010-05-28  
CAS 直接操作内存,性能很好。

按照个人的理解,多CPU通过并行控制主存的CAS操作,但为什么不能分离内存操作了,分布式内存,岂不是更好?

相关推荐

Global site tag (gtag.js) - Google Analytics