Ramp SWE OA 面试复盘|Database Lock 如何拦住越权写入
Ramp 的数据库 OA 加到锁这一层,难点就从“字段如何存”变成了“这次操作有没有权限”。2024 年的一亩三分地讨论中,有参试者提到数据库题的 Level 3 要实现 lock,测试仍按单线程顺序执行。这里聚焦这道分阶段大题的加锁部。
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 的锁题需要写多线程吗?
顺序指令测试首先考察的是权限和状态。用记录到持锁人的映射表达即可;多线程实现解决的是另一层问题,不能替代接口规则。
删空记录时,应不应该一起删除锁?
看题面如何定义记录和锁的生命周期。本页练习采用保留锁的约定,因此需要两个独立映射;若题目要求自动释放,就在最后一个字段删除成功的分支显式释放,并为此写断言。
为什么被拒绝的操作还会影响隐藏测试?
因为返回失败之前,程序已经修改了统计、创建了空记录,或者先扣减了某个值。权限判断放在写入入口,能减少这类“返回值正确,内部状态错误”的情况。
参考来源
一亩三分地:Ramp 2024 OA 讨论及数据库锁关卡反馈 Glassdoor:Ramp 实习生数据库与所有权题反馈 Taro:Ramp 纽约 SWE 的分阶段数据库 OA 记录
联系 VOPathway
如果你希望把这套方法用于自己的 OA 或 VO 准备,可以把目标岗位、当前阶段、面试时间和主要难点发给 VOPathway,我们会据此安排针对性的练习与复盘。
- 微信:Coding0201
- 邮箱:[email protected]
- Telegram:@OAVOProxy
- WhatsApp:+86 178 6396 8105
可提供 OA辅助、OA辅导、VO辅助与 VO辅导。文章用于训练参考,不代表相关公司的官方流程;实际安排请以候选人收到的通知为准。
本文用于面试准备与训练复盘。公司名称仅用于标识题型素材主题,不代表官方合作或录用承诺。
预约一次训练复盘 ↗