必须关闭自动提交并用两个独立会话手动控制事务:先禁用 auto-commit,再分别在两个 query console 中执行 begin、更新语句(不提交),触发锁等待以复现死锁或隔离问题。

不能直接“运行事务脚本”来模拟并发——PhpStorm 的 SQL 执行默认是单会话、自动提交的,事务不会跨语句持久化,更不会阻塞其他会话。 想真实复现死锁、锁等待或隔离级别影响,必须手动控制会话生命周期、显式开启事务、暂停执行并保持连接打开。下面几步是绕不开的核心操作点。
手动开启事务后别自动提交
PhpStorm 默认启用 auto-commit,每条语句执行完立刻提交,BEGIN 或 START TRANSACTION 会被立即结束,根本留不住锁。必须关掉它:
- 在 Database 工具窗口中,右键目标数据源 → 选择 Properties
- 勾选 Disable auto-commit(不是“Use auto-commit”)
- 点击 OK 保存,该设置对当前会话生效
- 之后所有执行的 SQL 都需显式
COMMIT或ROLLBACK,否则事务一直挂起
用两个独立 SQL 文件/查询控制台模拟并发会话
单个 SQL 文件里的多条语句仍是串行执行,无法体现“会话 A 持有锁、会话 B 等待”的真实场景。必须开两个隔离环境:
- 新建两个 SQL 文件(如
session_a.sql和session_b.sql),或打开两个独立的 Query Console(Database 工具窗口右键 → New Query Console) - 分别在两个窗口中执行
SET autocommit = 0;(MySQL)或BEGIN;(PostgreSQL) - 在 session A 中执行更新语句(如
UPDATE orders SET status = 'processing' WHERE id = 123;),**不提交** - 立刻切到 session B,执行同一条记录的更新或 SELECT ... FOR UPDATE —— 此时会卡住,出现锁等待
- 观察 Database 工具窗口底部状态栏是否显示 “Executing…” 持续数秒,或查
information_schema.INNODB_TRX(MySQL)确认事务状态
注意事务解析模式和 schema 绑定问题
如果你的 SQL 脚本里含 USE db_name 或 SET search_path TO schema_x,但 PhpStorm 当前解析模式是 Playground,这些语句会被忽略,导致表名解析失败或操作到错误库:
- 右键 SQL 文件 → Attach Session…,绑定到你已配置的数据源
- 文件顶部会出现
<session></session>按钮,点击它 → 切换为 Script 模式(不是默认的 Playground) - 这样
USE或SET search_path才会影响后续语句的上下文解析 - 否则即使语句语法正确,也可能报错
Table 'xxx' doesn't exist,实际是因为没落到目标 schema
真正卡住你的往往不是语法,而是会话状态没维持住、schema 解析错位、或者误以为“选中多行执行”就等于并发——其实只是顺序执行。锁问题必须靠人工节奏控制:A 先锁、B 再碰、观察等待、最后释放。这没法全自动,但 PhpStorm 提供了足够底层的会话控制能力,关键是你得主动关掉 auto-commit 并拆开窗口。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











