1. 什么是悲观锁?
悲观锁是一种并发控制机制,假设并发访问会发生冲突,因此在访问共享资源之前先获取锁,阻塞其他线程的访问。它适用于对共享资源的读写操作频率较高、冲突概率较大的场景,但性能相对较低且可能导致死锁。
2. 什么是乐观锁?
乐观锁是一种并发控制机制,它假设并发访问不会发生冲突,因此不会阻塞其他线程的访问。在乐观锁中,线程在访问共享资源之前不会获取锁,而是在更新共享资源时进行检查,如果发现其他线程已经更新了该资源,则会进行相应的处理(如重试或回滚)。乐观锁适用于对共享资源的冲突概率较低、读操作频率较高的场景,它具有较高的并发性能,但需要处理并发冲突的情况。
3. 为什么会出现超卖问题?
- 超卖问题在电商、票务等领域经常出现,其主要原因是并发操作下的资源竞争和不一致性。
-
并发操作:当多个用户同时进行购买或预订等操作时,系统需要对资源进行并发处理。这会导致多个操作同时读取资源的可用数量,而不是等待其他操作完成后再进行判断。
-
资源竞争:多个用户同时竞争有限的资源,如库存、座位等。如果没有合适的并发控制机制,多个用户可能会同时判断资源可用,从而导致资源被超卖。
-
不一致性:由于网络延迟、系统负载等原因,多个操作可能在不同的时间完成,而不是按照顺序执行。这可能导致某些操作在判断资源可用后,实际上资源已经被其他操作占用或销售。
- 解决超卖问题的方法包括:
-
悲观锁:在购买或预订时使用悲观锁,即在访问资源前先获取锁,阻塞其他用户,确保同一时间只有一个用户可以操作资源。
-
乐观锁:在购买或预订时使用乐观锁,即在更新资源时进行冲突检测,如果发现资源已被占用,则进行相应处理,如重试或回滚,常用的乐观锁方案为版本号法和类版本号法。
-
限流控制:通过设置系统的并发访问限制,限制同时访问资源的用户数量,从而减少资源竞争和超卖问题。
-
库存预留:在用户下单或预订时,先将资源进行预留,只有在支付或确认后才真正扣减资源,避免多个用户同时判断资源可用导致超卖。