box.on_commit()
Определение триггера, выполняемого при завершении транзакции из-за события, например 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() doprint('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