6.1历史记录

“语句事务”是一个非标准术语,它来自MySQL支持BerkeleyDB存储引擎的时代。

首先,在BerkeleyDB中,“自动提交”模式会自动提交从存储引擎的角度来看是原子的操作,比如记录的写入,但从应用程序(MySQL)的角度来看,这些操作粒度太细,不可能是原子的。一条SQL语句可能涉及许多BerkeleyDB自动提交操作。所以BerkeleyDB自动提交对MySQL没什么用处。

其次,BerkeleyDB提供了“嵌套事务”的概念,而不是SQL标准保存点。简而言之:事务可以任意嵌套,但是当父事务被提交或中止时,它的所有子事务(嵌套的)也会被提交或中止。反过来,嵌套事务的提交使其更改可见,但不是持久的:它会销毁嵌套事务,因此所有嵌套事务的更改将对父事务和同一父事务的其他当前活动的嵌套事务可见。

因此MySQL采用嵌套事务的机制,为标准要求的SQL语句提供“全有或全无”的保证。MySQL将在每个SQL语句的开始处创建一个嵌套事务,并在语句结束时销毁(提交或中止)嵌套事务。MySQL内部把这样的嵌套事务称为“语句事务”。这就是“报表交易”一词的由来。