提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文
前言
在并发系统中,锁和幂等性都用来防止重复操作,但方式不同。
锁是“拦住别人,让自己先做”,保证同一时间只有一个人能操作。
幂等性是“不怕重复,做多次和做一次结果一样”。
一个管过程,一个管结果。
理解它们的区别,能让系统更安全、更高效。
一、关于幂等性
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();

最低0.47元/天 解锁文章
9万+

被折叠的 条评论
为什么被折叠?



