分布式锁的学习心得

抢单功能,电商超卖功能等场景需要考虑并发问题。

解决方案:

第一种设置数据库事务的隔离级别,设置喂Serializable,效率低下

第二种使用乐观锁解决,通过版本号进行控制

原理:我们在数据表上面添加一个乐观锁字段,数据类型是整数的,用来记录数据更新的版本号,这个跟SVN机制很像。

乐观锁是一种逻辑锁,他是通过版本号来判定有没有更新冲突出现。

比如说,现在A商品的乐观锁版本号是0,现在有事务1来抢购商品了。事务1记录下版本号是0,等到执行修改库存的时候,就把乐观锁的版本号设置成1。但是事务1在执行的过程中,还没来得及执行UPDATE语句修改库存。这个时候事务2进来了,他执行的很快,直接把库存修改成99,然后把版本号变成了1。这时候,事务1开始执行UPDATE语句,但是发现乐观锁的版本号变成了1,这说明,肯定有人抢在事务1之前,更改了库存,所以事务1就不能更新,否则就会出现超售现象。

简单说就是基础sql语句:

update order_info set status=2,uid=? where id=?

变成

update order_info set status=2,uid=? where id=? and status=1

where语句后面相当于加了一个乐观锁,后面的线程执行时更新记录为0,那么我就可以返回抢单失败。

spring框架中,乐观锁一般搭配@Transactional注解(事务)使用。

第三种加锁解决,synchronized及lock锁、分布式锁。

synchronized及lock锁都是本地锁,只在当前jvm生效。对集群环境不生效

synchronized测

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值