必须关闭navicat 16自动提交,否则update/delete无确认即生效且无法回滚;正确路径是右键连接→编辑连接→高级选项卡→取消“自动提交”→重新连接,关闭后需手动begin/commit/rollback,并以右下角“transaction”标识为准。
必须关闭自动提交,否则任何 update/delete 都会立即生效且无法回滚。
为什么关 Auto-Commit 是第一道生死线
Navicat 16 默认开启 auto-commit,执行 UPDATE 或 DELETE 时不会弹确认框,回车即提交。这不是快,是裸奔——没 WHERE 条件、拼错表名、连错库,全都会真实写入生产库。
常见错误现象包括:
- 执行
UPDATE users SET status = 'active'(漏 WHERE)后发现整张表被改掉 - 在标有“PROD”标签的连接里开了新 Query 标签页,误以为还在事务中,实际已自动提交
- 右下角状态栏没显示
Transaction,但自己以为“正在事务里”,结果一执行就落地
关闭路径和验证方式
这个设置不在「工具」→「选项」或 SQL 编辑器设置里,而是在连接级配置中:
- 右键左侧连接列表中的目标库(如
prod-db:3306)→「编辑连接…」 - 切换到「高级」选项卡 → 取消勾选「自动提交」
- 点「确定」→ 必须重新双击该连接进入,旧 Query 标签页仍沿用旧设置
验证是否生效:
- 打开新 Query 标签页,执行
UPDATE users SET name='test' WHERE id = -1(确保无匹配行) - 立刻执行
SELECT @@autocommit,返回0才算成功 - 右下角出现
Transaction字样,才是事务激活的唯一可信信号
关掉之后怎么安全改数据
关闭 auto-commit 后,你得手动控制事务生命周期:
- 先执行
BEGIN或直接点工具栏「开始事务」按钮 - 再运行你的
UPDATE/DELETE语句 - 确认结果无误后,执行
COMMIT;出错或想撤回,执行ROLLBACK
注意:某些 MySQL 8.0+ 连接(如 X DevAPI)或 SQL Server 的 Windows 身份验证模式会忽略客户端设置,强制服务端控制。若 SELECT @@autocommit 返回 1,需在数据库侧执行 SET SESSION autocommit = OFF。
容易被忽略的防护组合拳
单靠关 auto-commit 不够,生产环境还需叠加以下措施:
- 数据库账号只给
SELECT权限,真正要改时临时提权,改完立刻回收 - Navicat Team 中把生产连接设为「Viewer」角色——虽不能防 SQL 执行,但能防误点「编辑连接」导致密码/地址被改
- 生产库连接别名加红色标签,并在连接属性里启用 SSL 加密(防止中间人劫持)
- 大修改前,用
SELECT COUNT(*)和SELECT * FROM ... LIMIT 5先确认 WHERE 条件是否命中预期数据
最危险的不是不会操作,而是以为自己在安全区里——比如右下角没显示 Transaction 却照常执行 DML,或者开着「Viewer」角色就以为删不了数据。这些认知偏差,比语法错误更难调试。











