这两天写了一个逻辑,需求大概是这样的, 客户有硬件下单与小程序下单,此时需要保证下单原子性和库存一致,

因为是个单体项目,所以简单处理直接在Service添加synchronized,这样的话每个设备下单都要等到其他设备下完单

才可以下单,效率很低,后面,在内部维护了一个静态map,存储设备序列号,锁对象为设备序列号,这样控制每个设备串行下单,

不同设备并行下单.后面想着如果分布式部署,又会出问题,干脆一步到位,直接分布式锁.lock4j.

介绍完毕.

下面说一下遇到的问题.

Jmeter并发测试,库存对账失败.查阅资料,想起SB,是通过动态代理实现事务的.

下面说明两种失效的分析

1.添加synchronized在方法上或者代码块上

  加在方法上,动态代理后直接忽略synchronized,

  加在代码块上,释放锁与动态代理的事务提交先后不一致

2.使用分布式锁

  加在代码块上,释放锁与动态代理的事务提交先后不一致