InnoDB可以避免与为已知为只读的事务设置事务ID(TRX_ID字段)相关的开销。事务ID仅对于可能执行写操作或 锁定读取的事务(例如)需要 。消除不必要的事务ID可以减少每次查询或数据更改语句构造一个读取视图时都要查询的内部数据结构的大小。 SELECT … FOR UPDATE
InnoDB 在以下情况下检测到只读事务:
事务从该START TRANSACTION READ ONLY语句开始 。在这种情况下,尝试对数据库(针对InnoDB, MyISAM或其他类型的表)进行更改会导致错误,并且事务将继续以只读状态运行:
ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
您仍然可以在只读事务中对特定于会话的临时表进行更改,或对其发出锁定查询,因为这些更改和锁定对于其他任何事务都不可见。
autocommit启用了 该设置,以确保事务是单个语句,组成事务的单个语句是“非锁定” SELECT语句。也就是说, SELECT不使用FOR UPDATEorLOCK IN SHARED MODE 子句的a。
事务在没有该READ ONLY选项的情况下开始,但是尚未执行任何更新或显式锁定行的语句。在需要更新或显式锁之前,事务将保持只读模式。
因此,对于诸如报告生成器之类的读取密集型应用程序,您可以InnoDB 通过在START TRANSACTION READ ONLY和中 对它们进行分组来调整查询 序列COMMIT,或者autocommit 在运行SELECT语句之前打开设置,或者简单地避免任何数据更改语句散布在查询中,从而对查询序列进行调整。。
有关信息 START TRANSACTION,并 autocommit请参见 13.3.1节,“START TRANSACTION,COMMIT和ROLLBACK语句”。
笔记
符合自动提交,非锁定和只读(AC-NL-RO)资格的事务被排除在某些内部 InnoDB数据结构之外,因此不在SHOW ENGINE INNODB STATUS输出中列出 。




