更新库存的方法:
方法1:
Mapper代码:
<update id="updateStockVersion"> <![CDATA[ update product set stock = stock - #{1}, where id = #{0} ]]> </update>
Service代码:
public int updateStockVersion(long id, int num) { Product p = (id) ; int res = -1 ; if (p != null) { int stock = p.getStock() ; if (stock <= 0) { return -1 ; } if (stock < num) { return -1; } res = (id, num, p.getVersion()) ; } return res ; }
方法2:
加入版本控制(乐观锁)version
Mapper代码:
<update id="updateStockVersion"> <![CDATA[ update product set stock = stock - #{1}, version = version + 1 where id = #{0} and version = #{2} ]]> </update>
Service代码:
@Transactional(isolation = I) public int updateStockVersion(long id, int num) { Product p = (id) ; int res = -1 ; if (p != null) { int stock = p.getStock() ; if (stock <= 0) { return -1 ; } if (stock < num) { return -1; } res = Version(id, num, p.getVersion()) ; if (res == 0) { try { TimeUnit.MILLISECONDS.sleep(100) ; } catch (InterruptedException e) { e.printStackTrace(); } return updateStockVersion(id, num) ; } } return res ; }
这里简单加入了重试功能(无限次,这里不考虑性能)。
方法1:很普通的更新操作,有没有问题?
方法2:加了乐观锁重试,有没有问题?
欢迎大家写下答案!!!
Restful API设计规范
Java代码开发规范
SpringBoot多数据源配置详解
SpringCloud Hystrix实现资源隔离应用