低并发下的加锁问题

高并发下已有很多解决方案,说一说现公司在并发没太高的实际场景下是怎样控制并发问题的。

首先,采用乐观锁的思想,在校验时间戳或版本中选择了时间戳,基本思想是:每次更新数据都会更新时间戳为当前系统时间,在更新数据前先将本地时间戳与数据库里存的时间戳对比一下,若时间戳一样则证明没人改过,可以进行更新操作,否则不允许更新。从数据库获取数据时会获取到数据的时间戳t1,更新数据时,更新操作分为三步:1、重新查询数据库中的要更新的数据的时间戳t;2、比较t1和t,若相等则继续步骤3,若不相等则说明有别的事务已更新该数据,直接返回更新失败;3、更新数据库。

考虑这样的情况:如果有两个事务A和B同时去更新同一条数据,它们从数据库读取的都是t1,事务A执行到第二步的时候自然时校验通过,但此时在它还没执行第三步的时候事务B也运行到此处,那么事务B也将会校验时间戳通过,后果就是不知道数据库最终诗句是A的还是B的了。解决办法是将步骤1 2 3当成一个原子,执行1之前加锁,执行3后再释放锁,这样事务B在执行步骤1的时候得等待事务A锁的释放,然后查出的时间戳必然不等于t1,校验会失败。这里的加锁可以简单用map就能实现,将数据主键put进去,释放时将其remove即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值