[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 事务为列级锁,粒度更小。 根据锁机制的一般原则,粒度越小,并发性能越高。
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 事务为列级锁,粒度更小。 根据锁机制的一般原则,粒度越小,并发性能越高。