校招数据库高频题:用一次并发转账讲透死锁、重试与资金不变量

简介: 面试高频题:A→B与B→A转账并发时,因锁序不一致形成等待环(T1锁A等B,T2锁B等A),触发死锁检测回滚。高分答案需画时序图,指出统一按account_id升序加锁可破环;配合幂等request_id、余额校验与退避重试,并通过Barrier测试验证。终态须保障总余额守恒、流水唯一、账实一致。

面试官写下两条 SQL:先扣 A,再给 B 加钱。每条 UPDATE 单独执行都没问题,为什么 A 转 B 与 B 转 A 同时发生时会死锁?

如果只回答“数据库锁冲突”,还不够。高分答案要把两个事务的时间线画出来,并继续说明怎样修、怎样重试、怎样验证资金没有被重复移动。

死锁发生在事务之间
事务 T1 先锁账户 A,准备再锁 B;事务 T2 先锁 B,准备再锁 A。T1 等 T2 释放 B,T2 又等 T1 释放 A,等待图形成环。数据库通常会检测这个环,选择回滚其中一个事务,让另一个继续。

所以日志里可能看到的不是永久卡死,而是一个事务收到 deadlock detected 或 deadlock victim。应用若把它当普通 500 返回,用户就会觉得转账随机失败。

最直接的修复:统一锁顺序
无论资金从谁转给谁,都按 account_id 从小到大获取锁。A 转 B 与 B 转 A 会争抢同一个第一把锁,其中一个等待,但不会形成环。

BEGIN;

SELECT account_id, balance
FROM account
WHERE account_id IN (:from_id, :to_id)
ORDER BY account_id
FOR UPDATE;

UPDATE account
SET balance = balance - :amount
WHERE account_id = :from_id
AND balance >= :amount;

UPDATE account
SET balance = balance + :amount
WHERE account_id = :to_id;

INSERT INTO transfer_ledger(request_id, from_id, to_id, amount)
VALUES (:request_id, :from_id, :to_id, :amount);

COMMIT;
应用必须检查扣款 UPDATE 是否影响一行,否则余额不足时不能继续入账。transfer_ledger 的 request_id 应唯一,防止客户端或死锁重试重复转账。

为什么“捕获异常后重试”也可能出错
若应用每次重试都生成新的 request_id,第一次事务其实已提交但响应丢失时,第二次会再次转账。重试必须复用同一业务键,并只针对明确可重试错误,例如数据库报告的死锁或短暂锁等待超时。

退避也要有限,避免高冲突时所有线程立即重试形成新一轮碰撞。超过次数后返回可查询状态,让用户按 request_id 查最终结果。

import random
import time

def transfer_with_retry(service, command, max_attempts=3):
for attempt in range(max_attempts):
try:
return service.transfer(command) # command.request_id 始终不变
except service.DeadlockError:
if attempt == max_attempts - 1:
raise
time.sleep(0.02 (2 ** attempt) + random.random() 0.01)
自动化测试要主动制造等待环
普通并发压测不一定稳定复现。测试可以用 Barrier 控制两个事务:T1 锁 A 后暂停,T2 锁 B 后暂停,再让两边同时请求第二把锁。这样每次都能命中目标时序。

修复统一顺序后,继续跑相同实验,预期不再形成等待环;可能有一个事务短暂等待,但两者最终只有成功或明确余额不足。

最后用业务不变量收口
无论发生死锁、回滚还是重试,两个账户总余额保持不变;每个 request_id 最多一条成功流水;流水金额与账户差额一致;任何中间失败都不能出现只扣不加。

面试时可以按这个顺序回答:画等待环,说明数据库会回滚一个事务;用固定资源顺序预防;缩短锁持有时间;仅对可重试错误有限重试;用幂等键与余额对账保护终态。

如果你正在准备测试开发校招,这类题不要只背“死锁四条件”。通过 Python 全栈开发与自动化测试项目,亲手控制两个事务的交错并查询锁等待,你会真正理解并发测试为什么比单接口断言更难。

两条 UPDATE 的正确性,只属于各自的单线程世界;转账是否正确,要在事务交错、失败回滚和重试之后看最终资金账。

相关文章
|
14小时前
|
人工智能 前端开发 测试技术
GLM-5.2的1M上下文实测:我用它改造了一套祖传测试平台,22万行代码AI全迁完了
本文记录了一位测试架构师用智谱GLM-5.2(1M上下文)将开源平台testhub的AI能力迁移至自研测试平台的实战过程:分四步完成知识库、用例生成等模块迁移,全程上下文仅用60%,余40%空间;新增56个API、5个前端模块,零侵入原有功能,耗时3天、成本不足30元。
|
14小时前
|
人工智能 安全 JavaScript
上千条用例跑四十分钟却拦不住缺陷:用变异测试给回归集算笔经济账
本文直击AI时代回归测试新困境:用例暴增却漏掉关键缺陷。提出以“变异测试”重算回归集价值——不看覆盖率,而看每条用例是否“独占杀死”错误(即仅它能捕获的变异体)。通过轻量脚本实操,识别冗余用例(删之省时)与检测盲区(补之提效),让回归集从“数量膨胀”回归“质量经济”。
|
2天前
|
人工智能 测试技术 Shell
字节DeerFlow 2.0开源:智能体开始“自己干活”了,测试开发能蹭到什么?
DeerFlow 2.0是字节跳动开源的“超级智能体底座”,非脚本生成工具,而是端到端跑完测试全链路:自动解析需求、生成用例、执行接口测试、定位缺陷、完成回归。沙盒环境+动态子智能体+持久记忆,让AI真正“干活”,解放测试工程师专注判断与决策。
|
2天前
|
人工智能 API 开发者
DeepSeek V4.1‑Flash内测完整实战:接口调用、工具接入、踩坑排错与代码示例全指南
新一代MoE架构模型DeepSeek V4.1‑Flash开启限时内测,该版本采用全新模型架构,原生具备多模态图文理解能力,推理生成速度大幅提升,同时沿用原有V4‑Flash计费标准,让开发者可以抢先体验迭代后的模型能力。本次内测属于限时中间版本,使用专门的临时模型标识符`deepseek‑v4.1‑flash‑expires‑on‑0910`,接口基础地址保持不变,不需要重新申请API密钥,只需要修改请求内部model字段就可以完成调用。
137 3
|
3天前
|
前端开发 IDE Android开发
Qoder 上新 Mobile Use,开始验证移动端应用
Computer Use 已经可以操作电脑,Browser Use 可以进入正在使用的浏览器。Qoder 推出 Mobile Use 插件(Beta),在安卓、鸿蒙与 iOS 上将代码修改接入真机或模拟器,完成运行、交互与结果确认。
103 1
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
2026测试Skill大爆发:从“会写脚本”到“会设计智能体”
2026年测试行业正经历结构性变革:手工测试需求降47%,全栈测开增340%。“熟悉MCP协议”“具备Skill封装与工程化能力”已成硬性门槛,而非加分项。测试核心正从“写脚本”跃迁为“设计智能体”——验证对象由功能转向AI决策能力,底层资产从用例库升级为可复用Skill库。
|
13天前
|
人工智能 测试技术 定位技术
从0到1打造测试用例生成智能体:RAG+知识图谱实战全记录
本文揭秘如何用“RAG+知识图谱+智能体”三合一方案破解AI测试用例乱编难题:RAG负责精准检索文档,知识图谱建模业务关系(如“订单取消→库存回滚”),智能体融合二者驱动大模型生成高覆盖、可验证的用例。实战中人工审核通过率从32%跃升至89%,让AI不再瞎编,而是照着“业务地图”精准行走。
|
20天前
|
人工智能 JSON JavaScript
DeepSeek V4-Flash-Vision-Exp上线:UI自动化终于“长眼睛”了?
传统UI自动化难捕获视觉Bug:按钮被遮挡、文字截断等“看得见却测不出”的问题长期存在。DeepSeek V4-Flash-Vision-Exp上线,首次将多模态视觉理解引入测试流程——以截图+语义分析替代纯像素比对,让AI识别“哪里异常、为何重要”,再由Playwright验证事实,实现低成本、可工程化的视觉回归。
|
22天前
|
机器学习/深度学习 人工智能 自然语言处理
AI测试开发岗需求暴涨:2026秋招,高薪Offer都藏在这3个变化里
2026秋招实录:AI测试开发岗年薪35–45万,传统测试岗跌至16–18万。AI正重构测试——从“验证功能”转向“验证能力”,岗位需求激增340%,面试聚焦Agent兜底、幻觉测试等真场景。懂AI的测试工程师薪资高出30%–50%。基础不牢不行,只懂基础更不行。
|
6天前
|
人工智能 测试技术 API
OpenAI GPT‑6 Astra深度剖析:能力跃迁、实战演示、成本与第三方评测对比
北京时间2026年9月4日凌晨,OpenAI对外推出新一代旗舰大模型GPT‑6 Astra,官方将它定义为全世界智能水平最高、对齐效果最好的AI模型。在发布前的媒体闭门沟通会上,OpenAI总裁Greg Brockman抛出一句引发整个行业热烈讨论的观点:如今认为人类已经踏入AGI时代,已经算不上是异想天开的想法,欢迎大家来到AGI时代。这句话迅速传遍开发者圈子,也让GPT‑6 Astra成为全球AI领域焦点。
223 0