基于状态机的乐观锁 ——解决幂等性问题

Posted 死磕java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于状态机的乐观锁 ——解决幂等性问题相关的知识,希望对你有一定的参考价值。


我们通过以下三种方式实现乐观锁,解决高并发下数据一致性,很实用:

         1、通过增加版本号实现,我在很多项目上都是通过版本号来实现乐观锁的,但是加版本号毕竟对代码造成了侵入性,而且数据库会增加版本号字段。在很多场景尤其是系统升级时,并不方便。

           例子:  update  table  set  col =#{col},version =version +1

                        where id =#{id} and version =#{version }

     2、基于状态控制或时间戳实现乐观锁,状态控制实现乐观锁在部分场景可以用到

            如:购物下单,逻辑是当订单状态为已付款,才允许发货: 

             核心SQL        update  table  set  status=下一种状态  

                                    where  id =#{id} and status=#{status} 

            时间戳同版本号类似。

    3、还有一种场景,我们可以判断当库存 - 下单数量>0 实现。如:

            update table  set amout=amout-#{buys}

            where id=#{id} and amout-#{buys}>0


以上是关于基于状态机的乐观锁 ——解决幂等性问题的主要内容,如果未能解决你的问题,请参考以下文章

幂等性

系统幂等性设计

MQ中的坑及高并发下保证接口的幂等性

MQ中的坑及高并发下保证接口的幂等性

那些经常被问的JAVA面试题—— 幂等性

利用Redis实现分布式锁