利用CAS原理处理修改操作的分布式事务控制
1.CAS
CPU指令和程序并发原语中存在CAS概念,CompareandSet,就是修改一个寄存器区域或变量值时,先检查oldvalue,oldvalue相同再进行修改,否则放弃。
例如:
已知inta=1;
CAS赋值为compareAndSet(1,10);
这样,在多线程并发操作时,最终a将被原子性的修改,而不会发生冲突的结果。
而数据库的事务中并发冲突的场景与之非常类似,都是对共享资源竞争访问时的突出问题。
2.基于CAS机制的数据库update操作
由CAS的原理,可以考虑以类似的方式处理数据库的update操作。
假定订单OD_0100的总价款为1100元,现在要将其修改为1500元,
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事务为列级锁,粒度更小。根据锁机制的一般原则,粒度越小,并发性能越高。