redis分布式锁

业务需求
1 A请求处理业务,然后存储。
2 B请求处理业务,发现A处理了一半,然后更新。
简单的讲就是先进来业务insert,后进来的业务update
问题
A,B请求处理业务的时候很长,所以A请求进来后insert然后处理业务此时还没有commit事务,B随后进来发现还没有A,所以也insert,这样就出现了2条记录。
解决
1 延迟发送请求,A,B之间延时5秒,一般先进来的A肯定处理完了,B也就能update(如果A没处理完,还会出现问题)
2 在方法加上synchronized,这样A进来锁住,B进来等锁释放(如果分布式的机器就不起作用了)
3 分布式锁

参考:http://www.360doc.com/content/18/0528/08/36490684_757590223.shtml

在实际开发种遇到的问题
1 事务级别
由于业务的复杂,在A业务中加锁,当A释放锁时,虽然已经insert数据,并且commint,但是B事务已经开启,根据默认的sql事务是不可重复。也就是说B事务开启后,A即使提交了,数据库也查询不到。所以需要更改数据库级别
@Transactional isolation = Isolation.READ_COMMITTED

2 处理时间不够用了
由于业务的复杂,一般处理业务都需要1s-2s,所以我设置了5s失效。但是有时候数据多了,A可能处理超过5s,此时redis中锁的时间结束,B获得锁发现没有A。解决方法是做一个守护线程,不断的续命。每5秒加一次时间。当A业务结束时,守护线程也结束了。

有一个遗留问题,在设置守护线程时发现程序全部都执行完,但是守护线程不死。我猜想服务是注入spring中的,默认是单例,在单例中写一个守护线程可能该线程只能挂起,不会销毁。因为bean没有销毁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值