Spec-Zone.ru › MySQL 8.4

10.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, см. Раздел 15.3.1, «Операторы START TRANSACTION, COMMIT и ROLLBACK».

Примечание

Транзакции, которые соответствуют автоматическому подтверждению, без блокировки и только для чтения (AC-NL-RO), исключаются из определенных внутренних InnoDB структур данных и, следовательно, не отображаются в результатах SHOW ENGINE INNODB STATUS.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/innodb-performance-ro-txn.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API