8.5.3 Оптимизация транзакций InnoDB только для чтения
InnoDB может избежать накладных расходов, связанных с настройкой (TRX_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 UPDATEилиLOCK IN SHARED MODEклаузу.Транзакция запускается без опции
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.
© 2025 Oracle
Licensed under the GPLv2 License.