Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

box.on_commit()

box.on_commit(trigger-function [, old-trigger-function])

Определение триггера, выполняемого при завершении транзакции из-за события, например box.commit().

Функция-триггер может принимать параметр-итератор, как описано в примере к этому разделу.

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

Если выполнение триггера завершается ошибкой, последствия серьезны, и этого следует избегать — используйте механизм pcall() из Lua вокруг кода, который может завершиться ошибкой.

box.on_commit() должна вызываться внутри транзакции, а триггер перестает существовать по завершении транзакции.

Параметры:

  • trigger-function (function) — функция, которая станет триггерной функцией
  • old-trigger-function (function) — существующая триггерная функция, которая будет заменена на trigger-function

Возвращает

nil или указатель на функцию

Если параметры — (nil, old-trigger-function), то старый триггер удаляется.

Подробнее о характеристиках триггеров см. в разделе триггеры.

Пример 1

-- Вставка тестовых данных --box.space.bands:insert { 1, 'Roxette', 1986 }box.space.bands:insert { 2, 'Scorpions', 1965 }box.space.bands:insert { 3, 'Ace of Base', 1987 }-- Определение функции, вызываемой при фиксации --function print_commit_result()    print('Commit happened')end-- Фиксация транзакции --box.begin()box.space.bands:insert { 4, 'The Beatles', 1960 }box.on_commit(print_commit_result)box.commit()

Пример 2

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

Итератор содержит:

  • порядковый номер запроса
  • старое значение кортежа до запроса (nil для запроса insert)
  • новое значение кортежа после запроса (nil для запроса delete)
  • идентификатор спейса

В примере ниже показаны результаты двух запросов replace:

-- Вставка тестовых данных --box.space.bands:insert { 1, 'Roxette', 1986 }box.space.bands:insert { 2, 'Scorpions', 1965 }box.space.bands:insert { 3, 'Ace of Base', 1987 }-- Определение функции, вызываемой при фиксации --function print_replace_details(iterator)    for request_number, old_tuple, new_tuple, space_id in iterator() do        print('request_number: ' .. tostring(request_number))        print('old_tuple: ' .. tostring(old_tuple))        print('new_tuple: ' .. tostring(new_tuple))        print('space_id: ' .. tostring(space_id))    endend-- Фиксация транзакции --box.begin()box.space.bands:replace { 1, 'The Beatles', 1960 }box.space.bands:replace { 2, 'The Rolling Stones', 1965 }box.on_commit(print_replace_details)box.commit()

Результат может выглядеть так:

request_number: 1old_tuple: [1, 'Roxette', 1986]new_tuple: [1, 'The Beatles', 1960]space_id: 512request_number: 2old_tuple: [2, 'Scorpions', 1965]new_tuple: [2, 'The Rolling Stones', 1965]space_id: 512