InnoDB
可以避免與設定已知為唯讀的交易的交易 ID (TRX_ID
欄位) 相關的額外負荷。只有可能執行寫入作業或鎖定讀取的交易才需要交易 ID,例如 SELECT ... FOR UPDATE
。消除不必要的交易 ID 會減少每次查詢或資料變更陳述式建構讀取視圖時會諮詢的內部資料結構大小。
當以下情況時,InnoDB
會偵測唯讀交易
交易使用
START TRANSACTION READ ONLY
陳述式啟動。在這種情況下,嘗試對資料庫進行變更(對於InnoDB
、MyISAM
或其他類型的資料表)會導致錯誤,並且交易會繼續處於唯讀狀態ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
您仍然可以在唯讀交易中對工作階段特定的暫存資料表進行變更,或為它們發出鎖定查詢,因為這些變更和鎖定對任何其他交易都不可見。
autocommit
設定已開啟,因此保證交易是單一陳述式,而組成交易的單一陳述式是「非鎖定」SELECT
陳述式。也就是說,不使用FOR UPDATE
或LOCK IN SHARED MODE
子句的SELECT
。交易在未指定
READ ONLY
選項的情況下啟動,但尚未執行任何更新或明確鎖定列的陳述式。在需要更新或明確鎖定之前,交易會保持在唯讀模式。
因此,對於像是報表產生器這類讀取密集型應用程式,您可以將它們群組在 START TRANSACTION READ ONLY
和 COMMIT
中,或者在執行 SELECT
陳述式之前開啟 autocommit
設定,或單純避免穿插查詢的任何資料變更陳述式,來調整一連串 InnoDB
查詢。
如需 START TRANSACTION
和 autocommit
的相關資訊,請參閱章節 15.3.1,「START TRANSACTION、COMMIT 和 ROLLBACK 陳述式」。
符合自動提交、非鎖定和唯讀 (AC-NL-RO) 資格的交易會保留在某些內部 InnoDB
資料結構之外,因此不會列在 SHOW ENGINE INNODB STATUS
輸出中。