
1) 【一句话结论】:实验预约系统中,多个用户同时预约同一设备时,需通过**并发控制策略(如乐观锁或悲观锁)**保证数据一致性,核心是通过控制并发访问顺序或检查冲突,防止设备被重复预约,其中乐观锁适用于冲突概率低的场景,悲观锁适用于高冲突场景。
2) 【原理/概念讲解】:当多个用户同时请求预约同一设备时,数据库中该设备的“可用状态”和“预约记录”可能因并发操作产生冲突(比如用户A和用户B都看到设备可用,各自提交预约,导致设备被重复占用)。并发控制的目标是确保最终只有一个预约成功。
3) 【对比与适用场景】:
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 悲观锁 | 操作前加锁,阻止其他事务修改该设备记录 | 严格控制并发,冲突时立即失败 | 设备预约冲突概率高(如热门设备) | 可能导致死锁,性能受锁粒度影响 |
| 乐观锁 | 操作后检查冲突,冲突时重试 | 简单实现,冲突时重试 | 设备预约冲突概率低(如冷门设备) | 需要版本号/时间戳字段,冲突时需重试逻辑 |
4) 【示例】(乐观锁实现):
假设设备表结构:
CREATE TABLE equipment (
id INT PRIMARY KEY,
name VARCHAR(50),
available BOOLEAN DEFAULT TRUE,
version INT DEFAULT 0 -- 版本号,用于乐观锁
);
预约接口逻辑(伪代码):
def reserve_equipment(user_id, equipment_id):
# 1. 查询设备当前状态和版本号
equipment = db.query("SELECT available, version FROM equipment WHERE id = ?", equipment_id)
if not equipment:
return "设备不存在"
# 2. 更新设备状态,检查版本号是否一致
updated = db.update(
"UPDATE equipment SET available = FALSE, version = version + 1 WHERE id = ? AND version = ?",
equipment_id, equipment.version
)
if updated == 0: # 版本号不一致,冲突
return "设备已被其他用户预约,请重试"
return "预约成功"
5) 【面试口播版答案】:
“在实验预约系统中,多个用户同时预约同一设备时,为保证数据一致性,我会采用乐观锁策略(冲突概率低时更高效)。具体实现是:在设备表中添加一个version字段(整数自增),预约时先查询设备当前状态和版本号,然后更新设备为“不可用”并递增版本号。若更新时发现版本号与查询时不同(说明已被其他事务修改),则返回冲突错误并让用户重试。这样既能保证数据一致性,又避免了悲观锁的锁竞争问题。”
6) 【追问清单】:
7) 【常见坑/雷区】: