
Ramp 的数据库 OA 加到锁这一层,难点就从“字段怎么存”变成了“这次操作有没有权限”。2024 年的一亩三分地讨论中,有参试者提到数据库题的 Level 3 要实现 lock,测试仍按单线程顺序执行。这里聚焦这道分阶段大题的加锁部分。
不同数据库题的后续要求并不相同。纽约 SWE 的一次 CodeSignal 记录写的是逐步加入时间戳和 TTL;Glassdoor 的实习生记录则提到插入、删除和所有权。准备时先读清自己题目里的接口,别把另一套题的过期规则直接搬进来。
第一题:给数据库记录加上操作权限
题目描述
这道题要求实现一个内存数据库,并在已有数据操作上加入权限控制。数据按记录 key 和字段 field 组织;加入调用者身份后,同一条写入指令要根据记录的持锁人决定是否执行。
为了把状态变化推演清楚,下面采用一组自拟练习约定:未加锁的记录允许修改;加锁后只有持锁人可以写入,其他调用者和不带身份的写接口都被拒绝;读取不受锁限制。重复加同一把锁不增加计数,也不建立等待队列。练习还约定,删除最后一个字段只清空数据,锁仍归原持有人,直到显式解锁。这些约定用于练习状态机,实际返回值和删空后的行为须逐项对应题面。
用记录 invoice-7 演练:先写入 amount=80,再让用户 A 持锁。用户 B 尝试把金额增加 20,这次写入被拒绝,金额仍为 80。A 将金额增加 5,结果变成 85。随后 A 删除最后一个字段,B 再尝试重建该记录;按上述约定,B 仍没有写入权限。
解题思路
把数据和锁分开保存。records[key][field] 负责字段内容,owners[key] 负责当前持锁人。不要用“记录还在不在”代替“锁还在不在”,否则删除最后一个字段时,一次清理就会意外放开权限。
所有写接口都经过同一个权限判断:没有持锁人则允许写入;存在持锁人时,只有非空的调用者 ID 与持锁人相等才允许执行。这个判断应发生在创建字典、改变数值和更新统计之前。尤其要检查不带 caller 的旧版接口:新增一个带身份的接口之后,旧接口仍能直接修改字典,就等于留了一条绕过锁的路径。
以 invoice-7 为例,可以把测试写成一条连续操作链:A 加锁,B 写入失败,A 写入成功,A 删空,B 重建失败,A 解锁,B 重建成功。每一步都同时检查返回值、字段内容和持锁人。只在最后查一次金额,无法发现中间曾经发生过越权修改。
若题目还要求记录成功修改的次数,应在数据更新完成后再递增。拒绝写入不计数;读操作不计数;加锁和解锁是否计数,按该接口的统计定义处理。练习里可让 B 连续失败三次,再执行一次 A 的有效写入,确认统计只增加一次。删除不存在的字段也要单独检查,不能只因为调用了删除函数就认定修改成功。
查询接口同样不要产生副作用。使用会自动创建默认值的容器时,读取不存在的 key 会留下空记录;如果加锁接口以“key 存在”为条件,这次读取就改变了后续行为。读取宜先查存在性,再返回值。
这里的 lock 表示顺序执行的指令权限。单线程模拟用持锁人映射就能表达,不需要为了这个词创建线程、互斥量或阻塞等待。只有题面真的加入并发执行,才需要另外处理检查权限与写入之间的原子性。
复杂度:采用哈希表后,单次字段查询、权限判断和修改的期望时间为 O(1);保存 F 个字段及 L 条锁记录需要 O(F+L) 空间。若增加排序或排行榜接口,应另外计算其开销。
Ramp OA 练习时,先画一张操作表
开始写代码前,把每个接口在三种状态下的行为列出来:无锁、自己持锁、别人持锁。表里填写返回值和是否修改数据。删空、重复加锁、重复解锁是额外的生命周期检查,不能只靠“正常写入成功”那一个样例覆盖。
给这道锁练习安排一次 45 分钟模拟即可:先完成数据操作和权限入口,再把连续操作链跑通,最后检查旧接口与统计。这个时间是练习安排,不是 Ramp 的统一考试时长。正式测评使用邀请中的时间和规则。
FAQ
Ramp OA 的锁题需要写多线程吗?
顺序指令测试首先考察的是权限和状态。用记录到持锁人的映射表达即可;多线程实现解决的是另一层问题,不能替代接口规则。
删空记录时,应不应该一起删除锁?
看题面如何定义记录和锁的生命周期。本页练习采用保留锁的约定,因此需要两个独立映射;若题目要求自动释放,就在最后一个字段删除成功的分支显式释放,并为此写断言。
为什么被拒绝的操作还会影响隐藏测试?
因为返回失败之前,程序已经修改了统计、创建了空记录,或者先扣减了某个值。权限判断放在写入入口,能减少这类“返回值正确,内部状态错误”的情况。
参考来源
关于 CSINTERVIEWHELP
准备 Ramp OA,可以找 CSINTERVIEWHELP 做题目讲解和限时模拟,重点检查权限判断、状态变化和测试覆盖。无论是 OA 题型解析、OA 辅导、VO 模拟面试、项目深挖还是系统设计训练,都可以按目标岗位安排练习:CSINTERVIEWHELP · 服务详情
