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

[b]1. CAS [/b]
CPU指令 和 程序并发原语中存在 CAS 概念, Compare and Set, 就是修改一个寄存器区域或变量值时,先检查 old value, old value相同再进行修改,否则放弃。

例如:
已知 int a = 1;
[quote] 非 CAS 赋值为: a = 10;
CAS 赋值为 compareAndSet( 1, 10);
[/quote]
这样,在多线程并发操作时,最终 a 将被原子性的修改,而不会发生冲突的结果。

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

[b]2. 基于CAS机制的数据库update操作[/b]
由CAS的原理,可以考虑以类似的方式处理数据库的update操作。

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

[quote] update sale_order set order_amount = 1500.00
where order_id = 'OD_0100'
[/quote]

采用 CAS 机制进行修改,假定已经知道订单修改前的总价款 1100,则update SQL为
[quote]
update sale_order set order_amount = 1500.00
where order_id = 'OD_0100'
and order_amount = 1100.00
[/quote]
若出现并发冲突,例如:order_amount 已经先其他请求修改为 900, 那么上面的 update 语句的操作结果数为 0; 此时,客户端需要重新查询订单,再尝试第二次修改。 这类似于 CAS 中的自旋。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值