数据库分布式锁及实战演练

本文详细介绍了数据库分布式锁的实现方式,包括悲观锁和乐观锁。悲观锁通过for update实现,但在并发场景下易导致死锁。乐观锁利用版本机制,在加锁和解锁过程中通过更新记录来控制并发,确保数据一致性。文中提供了实战演练,展示如何在Java中正确使用分布式锁,并强调了解锁操作的重要性。
摘要由CSDN通过智能技术生成

分布式锁实现方式~DB

超详细的数据库分布式锁及实战演练,不要错过

本节重点

  • 数据库分布式锁实现原理
  • 掌握悲观锁和乐观锁

分布式锁实现方式

悲观锁

悲观锁是在数据修改之前,把待修改的数据进行锁定,防止并发修改。通常采用for update加锁方式来实现,使用时需要注意以下两点:

  • 首先要开启事务
  • 在for update语句中where条件字段上创建索引,因为是通过索引来加锁的,否则会锁整个表。

无事务的for update演练

模拟100个用户抢购商品,商品销售数量做加1操作,校验数据库中的销售数量是否是100,代码如下:

​@DS(Constant.DataSource.MASTER)
@Override
public BaseResponse<BoolResult> testLock() {

    GoodsInfo goodsInfo = baseMapper.selectOne(new LambdaQueryWrapper<GoodsInfo>().eq(GoodsInfo::getId,1)
                                               .last(" for update"));
    goodsInfo.setSaleCount(goodsInfo.getSaleCount() + 1);
    Integer result = baseMapper.updateById(goodsInfo);
    if (result != null && result.intValue() > 0) {
        log.warn("testLock success!");
        return BaseResponse.ok(new BoolResult(true));
    } else {
        log.warn("testLock fail!");
        return BaseResponse.ok(new BoolResult(false));
    }
}

结果:日志‘testLock success!’ 打印了 100条,而库中销售数量是2,显然和我们预期结果不一致

有事务的for update演练

@DS(Constant.DataSource.MASTER)
@Transactional(rollbackFor = Exception.class)
@Override
public BaseResponse<BoolResult> testLock() {

    GoodsInfo goodsInfo = baseMapper.selectOne(new LambdaQueryWrapper<GoodsInfo>().eq(GoodsInfo::getId,1)
                                               .last(" for update"));
    goodsInfo.setSaleCount(goodsInfo.getSaleCount() + 1);
    Integer result = baseMapper.updateById(goodsInfo);
    if (result != null && result.intValue() > 0) {
        log.warn("testLock success!");
        return B
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗨,您好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值