MySQL事务执行遇错误未回滚,为何第一条插入仍生效?
问题原因解析
出现这种情况的核心是数据库对事务中错误的处理逻辑,具体可以从这几点来看:
- 错误类型决定事务走向:你第二条语句的错误是引用了不存在的
brak字段,这类属于单条语句的执行错误,而非会直接摧毁整个事务的致命错误。像MySQL这类数据库遇到这种情况时,只会终止当前出错的语句,不会自动回滚之前已经执行成功的操作,第一条insert的结果依然留在事务中。 - commit命令的作用:你最后执行了
commit,数据库会把事务里所有执行成功的操作都提交到磁盘。第一条插入已经完成且没出错,自然就被永久保存到表中了。 - 不同数据库的行为差异:比如PostgreSQL在事务中出现错误后,整个事务会进入“不可用”状态,这时执行
commit会直接失败;但MySQL的InnoDB引擎默认不会自动回滚非致命错误的事务,必须手动执行rollback才能撤销之前的操作。
如果想实现“一条出错就全回滚”的效果,要么调整数据库配置(比如MySQL开启innodb_strict_mode),要么在代码里捕获错误后主动调用rollback,而不是继续执行commit。
内容的提问来源于stack exchange,提问作者rene smith
相关产品推荐
相关产品推荐

