并发环境下幂等性和锁机制区别

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文


前言

在并发系统中,锁和幂等性都用来防止重复操作,但方式不同。
锁是“拦住别人,让自己先做”,保证同一时间只有一个人能操作。
幂等性是“不怕重复,做多次和做一次结果一样”。
一个管过程,一个管结果。
理解它们的区别,能让系统更安全、更高效。


一、关于幂等性

1.定义

幂等性是指:同一个操作执行一次或多次,对系统产生的结果是一样的。
👉 做1次 = 做100次,结果不变。
🌰 举个生活中的例子:
按电梯的“关门”按钮:

  • 按1次 → 门开始关
  • 连续按10次 → 还是“开始关”,不会突然又开又关

✅ 这就是幂等操作。

而“发短信”就不是幂等的:

  • 发1次 → 收到1条
  • 发10次 → 收到10条

❌ 不是幂等操作。

2.应用场景

在系统开发中,尤其是网络请求、支付、下单、消息消费等场景,经常会出现:

  • 网络超时,客户端重试
  • 消息队列重复投递
  • 用户手抖点了两次提交

如果不做幂等处理,就会导致:

  • 重复扣款 ❌
  • 重复下单 ❌
  • 库存多减 ❌

二、关于锁机制

1.定义

锁机制是一种同步控制手段,用于管理多个进程或线程对共享资源的访问,确保在同一时刻只有一个进程或线程能够对特定资源进行操作。锁的主要目的是避免数据竞争和不一致性。
简单来说,锁就像一个“门卫”,当某个线程获取到锁后,其他试图访问相同资源的线程必须等待,直到该锁被释放。

🌰 类比生活中的例子:

  • 公共厕所:如果一个人进去上厕所,他通常会把门从里面锁上,其他人就无法进入,直到这个人出来并解锁。
  • 会议室预定系统:某人预订了会议室,在会议期间,其他人不能使用这个会议室,直到预订结束。

2.锁分类

1.按照颗粒度分类

  • 行级锁:数据库InnoDB默认为行级锁

  • 表级锁:MyISAM为表级锁

2.行为分类

  • 共享锁:只能读不能写
  • 排他锁(互斥锁):阻止其他所有事务获取该资源上的任何类型的锁(包括共享锁和排他锁)synchronized,分布式锁等等…

3.实现方式分类

  • 乐观锁:读多写少的场景,如大多数Web应用
  • 悲观锁:写多读少的场景,或者需要严格顺序执行的任务
  • 分布式锁:redis

分布式代码(示例):

RLock lock = redissonClient.getLock(LOCK_KEY + code);
        String reqBody = null;
        String respBody = null;
        String apiLogStatus = ApiLogConstants.LOG_STATUS_1;
        try {
   
   
            if (!lock.tryLock()) {
   
   
                throw new ServiceException("账单正在处理,请稍后重试");
            }

            String token = getToken();
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值