14.2.2.7 Implicit Transaction Commit and Rollback 隐式的事务提交和回滚

默认情况下,MySQL 启动会话对于每个新的连接 是自动提交模式,

所以MySQL 在每个SQL语句执行后提交 如果SQL语句不返回错误

如果SQL 语句返回一个错误,commit 或者rollback 行为依赖错误。

如果一个会话关闭自动提交,没有显示的提交最后的事务,MySQL 回滚事务。

14.2.2.8 Deadlock Detection and Rollback 死锁检测和回滚

InnoDB 自动检测事务死锁和回滚一个事务或者多个事务来解决死锁。

InnoDB 尝试挑选小的事务回滚, 事务的大小取决于插入,更新,删除记录的数目。

InnoDB 是意识到表锁 如果 innodb_table_locks = 1 (the default) and autocommit = 0,

MySQL layer 在它上面 知道关于row-level locks.

否则, InnoDB 不能检测deadlocks 当一个表lock 设置通过一个MySQL LOCK TABLES 语句

或者 一个lock 通过存储引擎设置相比InnoDB 被涉及。 解决那些冲突通过设置innodb_lock_wait_timeout 系统变量

当InnoDB 执行一个完整的事务回滚,所有的locks 通过事务的被释放。

然而,如果一个单独的SQL语句 被回滚 由于错误,

一些locks 通过语句设置的可能被保存

这个发生在当InnoDB 存储行锁 以一种格式 它不能知道

如果一个SELECT 调用一个存储函数在一个事务, 语句的函数失败,

语句回滚。此外, 如果回滚被执行,整个事务被回滚。