Spec-Zone.ru › MySQL 5.7

25.12.7 Таблицы событий транзакций Performance Schema

  • 25.12.7.1 Таблица events_transactions_current
  • 25.12.7.2 Таблица events_transactions_history
  • 25.12.7.3 Таблица events_transactions_history_long

Performance Schema отслеживает транзакции. В иерархии событий, события ожидания вложены в события стадии, которые вложены в события инструкции, которые вложены в события транзакции.

Эти таблицы хранят события транзакций:

  • events_transactions_current: текущее событие транзакции для каждого потока.

  • events_transactions_history: самые последние события завершённых транзакций на поток.

  • events_transactions_history_long: самые последние глобальные (по всем потокам) события завершённых транзакций.

В следующих разделах описываются таблицы событий транзакций. Также существуют сводные таблицы, агрегирующие информацию об событиях транзакций; см. Раздел 25.12.15.4, “Таблицы сводки транзакций”.

Для получения дополнительной информации об отношениях между тремя таблицами событий транзакций, см. Раздел 25.9, “Таблицы Performance Schema для текущих и исторических событий”.

  • Настройка сбора событий транзакций

  • Границы транзакций

  • Измерение транзакций

  • Транзакции и вложенные события

  • Транзакции и хранимые программы

  • Транзакции и контрольные точки

  • Транзакции и ошибки

Настройка сбора событий транзакций

Для управления сбором событий транзакций, установите состояние соответствующих инструментов и потребителей:

  • Таблица setup_instruments содержит инструмент с именем transaction. Используйте этот инструмент для включения или выключения сбора отдельных классов событий транзакций.

  • Таблица setup_consumers содержит значения потребителей с именами, соответствующими именам таблиц текущих и исторических событий транзакций. Используйте этих потребителей для фильтрации сбора событий транзакций.

Инструмент transaction и потребители транзакций по умолчанию отключены:

mysql> SELECT *
       FROM performance_schema.setup_instruments
       WHERE NAME = 'transaction';
+-------------+---------+-------+
| NAME        | ENABLED | TIMED |
+-------------+---------+-------+
| transaction | NO      | NO    |
+-------------+---------+-------+
mysql> SELECT *
       FROM performance_schema.setup_consumers
       WHERE NAME LIKE 'events_transactions%';
+----------------------------------+---------+
| NAME                             | ENABLED |
+----------------------------------+---------+
| events_transactions_current      | NO      |
| events_transactions_history      | NO      |
| events_transactions_history_long | NO      |
+----------------------------------+---------+

Для управления сбором событий транзакций при запуске сервера, используйте такие строки в файле my.cnf:

  • Включить:

    [mysqld]
    performance-schema-instrument='transaction=ON'
    performance-schema-consumer-events-transactions-current=ON
    performance-schema-consumer-events-transactions-history=ON
    performance-schema-consumer-events-transactions-history-long=ON
    
  • Отключить:

    [mysqld]
    performance-schema-instrument='transaction=OFF'
    performance-schema-consumer-events-transactions-current=OFF
    performance-schema-consumer-events-transactions-history=OFF
    performance-schema-consumer-events-transactions-history-long=OFF
    

Для управления сбором событий транзакций во время выполнения, обновите таблицы setup_instruments и setup_consumers:

  • Включить:

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'YES', TIMED = 'YES'
    WHERE NAME = 'transaction';
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'YES'
    WHERE NAME LIKE 'events_transactions%';
    
  • Отключить:

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'NO', TIMED = 'NO'
    WHERE NAME = 'transaction';
    
    UPDATE performance_schema.setup_consumers
    SET ENABLED = 'NO'
    WHERE NAME LIKE 'events_transactions%';
    

Для сбора событий транзакций только для определённых таблиц событий транзакций, включите инструмент transaction, но только потребителей транзакций, соответствующих требуемым таблицам.

Таблица setup_timers содержит строку со значением NAME, равным transaction, которое указывает единицу измерения времени событий транзакций. По умолчанию единица измерения NANOSECOND:

mysql> SELECT *
       FROM performance_schema.setup_timers
       WHERE NAME = 'transaction';
+-------------+------------+
| NAME        | TIMER_NAME |
+-------------+------------+
| transaction | NANOSECOND |
+-------------+------------+

Для изменения единицы измерения, измените значение TIMER_NAME:

UPDATE performance_schema.setup_timers
SET TIMER_NAME = 'MICROSECOND'
WHERE NAME = 'transaction';

Для получения дополнительной информации о настройке сбора событий, см. Раздел 25.3, “Настройка Performance Schema при запуске” и Раздел 25.4, “Настройка Performance Schema во время работы”.

Границы транзакций

В MySQL Server транзакции начинаются явно следующими операторами:

START TRANSACTION | BEGIN | XA START | XA BEGIN

Транзакции также могут начинаться неявно. Например, когда переменная системы autocommit включена, начало каждой инструкции запускает новую транзакцию.

Когда autocommit отключена, первая инструкция после подтверждённой транзакции отмечает начало новой транзакции. Последующие инструкции являются частью транзакции до её подтверждения.

Транзакции явно завершаются следующими операторами:

COMMIT | ROLLBACK | XA COMMIT | XA ROLLBACK

Транзакции также могут неявно завершаться, выполнением инструкций DDL, блокировки, и административных инструкций сервера.

В следующем обсуждении, ссылки на START TRANSACTION также применяются к BEGIN, XA START и XA BEGIN. Аналогично, ссылки на COMMIT и ROLLBACK применяются к XA COMMIT и XA ROLLBACK соответственно.

Performance Schema определяет границы транзакций аналогично серверу. Начало и конец события транзакции тесно связаны с соответствующими переходами состояния на сервере:

  • Для явно начатой транзакции, событие транзакции начинается во время обработки инструкции START TRANSACTION.

  • Для неявно начатой транзакции, событие транзакции начинается в первой инструкции, использующей транзакционный движок после завершения предыдущей транзакции.

  • Для любой транзакции, явно или неявно завершённой, событие транзакции завершается, когда сервер переходит из активного состояния транзакции во время обработки COMMIT или ROLLBACK.

Это подразумевает некоторые тонкости:

  • События транзакций в Performance Schema не полностью включают события заявок, связанные с соответствующими операторами START TRANSACTION, COMMIT или ROLLBACK. Существует незначительное временное перекрытие между событием транзакции и этими операторами.

  • Операторы, работающие с нетранзакционными движками, не влияют на состояние транзакции соединения. Для неявных транзакций событие транзакции начинается с первого оператора, использующего транзакционный движок. Это означает, что операторы, работающие исключительно с нетранзакционными таблицами, игнорируются, даже после START TRANSACTION.

Для иллюстрации рассмотрим следующий сценарий:

1. SET autocommit = OFF;
2. CREATE TABLE t1 (a INT) ENGINE = InnoDB;
3. START TRANSACTION;                       -- Transaction 1 START
4. INSERT INTO t1 VALUES (1), (2), (3);
5. CREATE TABLE t2 (a INT) ENGINE = MyISAM; -- Transaction 1 COMMIT
                                            -- (implicit; DDL forces commit)
6. INSERT INTO t2 VALUES (1), (2), (3);     -- Update nontransactional table
7. UPDATE t2 SET a = a + 1;                 -- ... and again
8. INSERT INTO t1 VALUES (4), (5), (6);     -- Write to transactional table
                                            -- Transaction 2 START (implicit)
9. COMMIT;                                  -- Transaction 2 COMMIT

С точки зрения сервера, транзакция 1 завершается, когда создается таблица t2. Транзакция 2 не начинается до тех пор, пока не будет обработана транзакционная таблица, несмотря на промежуточные обновления нетранзакционных таблиц.

С точки зрения Performance Schema, транзакция 2 начинается, когда сервер переходит в активное состояние транзакции. Операторы 6 и 7 не включаются в границы транзакции 2, что согласуется с тем, как сервер записывает транзакции в бинарный журнал.

Инструментирование транзакций

Транзакции определяются тремя атрибутами:

  • Режим доступа (только чтение, чтение/запись)

  • Уровень изоляции (SERIALIZABLE, REPEATABLE READ и так далее)

  • Неявная (autocommit включена) или явная (autocommit отключена)

Для уменьшения сложности инструментации транзакций и обеспечения того, что собранные данные о транзакциях предоставляют полные и осмысленные результаты, все транзакции инструментируются независимо от режима доступа, уровня изоляции или режима autocommit.

Для выборочного просмотра истории транзакций используйте атрибуты столбцов в таблицах событий транзакций: ACCESS_MODE, ISOLATION_LEVEL и AUTOCOMMIT.

Затраты на инструментацию транзакций можно снизить различными способами, например, включением или отключением инструментации транзакций в зависимости от пользователя, учетной записи, хоста или потока (соединения с клиентом).

Транзакции и вложенные события

Родительским событием события транзакции является событие, которое инициировало транзакцию. Для явно начатой транзакции это включает в себя операторы START TRANSACTION и COMMIT AND CHAIN. Для неявной транзакции — это первый оператор, использующий транзакционный движок после завершения предыдущей транзакции.

В общем случае транзакция является родительским элементом верхнего уровня для всех событий, инициированных во время транзакции, включая операторы, явно завершающие транзакцию, такие как COMMIT и ROLLBACK. Исключение составляют операторы, неявным образом завершающие транзакцию, такие как операторы DDL, в этом случае текущая транзакция должна быть подтверждена перед выполнением нового оператора.

Транзакции и хранимые программы

Транзакции и события хранимых программ связаны следующим образом:

  • Хранимые процедуры

    Хранимые процедуры работают независимо от транзакций. Хранимую процедуру можно начать в рамках транзакции, и транзакцию можно начать или завершить изнутри хранимой процедуры. Если хранимую процедуру вызывают изнутри транзакции, она может выполнять операторы, которые заставляют подтвердить родительскую транзакцию, а затем начать новую транзакцию.

    Если хранимая процедура запускается внутри транзакции, эта транзакция является родительским событием события хранимой процедуры.

    Если транзакция запускается хранимой процедурой, хранимая процедура является родителем события транзакции.

  • Хранимые функции

    Хранимые функции ограничены в возможности вызывать явное или неявное подтверждение или откат. События хранимых функций могут находиться внутри родительского события транзакции.

  • Триггеры

    Триггеры активируются в рамках оператора, обращающегося к таблице, с которой он связан, поэтому родителем события триггера всегда является оператор, который его активирует.

    Триггеры не могут издавать операторы, вызывающие явное или неявное подтверждение или откат транзакции.

  • Расписанные события

    Выполнение операторов в теле расписанного события происходит в новом соединении. Вложенность расписанного события внутри родительской транзакции неприменима.

Транзакции и точки сохранения

Операторы точки сохранения записываются как отдельные события операторов. События транзакций включают отдельные счетчики для операторов SAVEPOINT, ROLLBACK TO SAVEPOINT и RELEASE SAVEPOINT, выпущенных во время транзакции.

Транзакции и ошибки

Ошибки и предупреждения, возникающие в рамках транзакции, регистрируются в событиях операторов, но не в соответствующем событии транзакции. Это включает специфические для транзакции ошибки и предупреждения, такие как откат по нетранзакционной таблице или ошибки согласованности GTID.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/performance-schema-transaction-tables.html

Spec-Zone.ru

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