box.on_commit()
-
box.
on_commit
(trigger-function[, old-trigger-function]) Определения триггера, выполняемого в случае окончания транзакции в связи с box.commit().
Функция с триггером может принимать параметр с итератором, как описано в примере к данному разделу.
Функция с триггером не должна получать доступ к любым спейсам базы данных.
Если триггер не сработает и выдаст ошибку, результат будет неблагоприятным, чего следует избегать – используйте Lua-механизм
pcall()
вокруг кода, который может не сработать.box.on_commit()
следует вызывать в пределах транзакции, и триггер прекращает существование по окончании транзакции.Параметры: - trigger-function (function) – функция, в которой будет триггер
- old-trigger-function (function) – существующая функция с триггером, которую заменит новая
возвращает: nil или указатель функции
Если указаны параметры
(nil, old-trigger-function)
, старый триггер будет удален.Подробная информация о характеристиках триггера находится в разделе Триггеры.
Простой и бесполезный пример: покажет, что произошел коммит:
function f() function f() print('commit happened') end box.begin() box.on_commit(f) box.commit()
Но, конечно, это еще не всё: параметр функции может быть ИТЕРАТОРОМ.
Итератор проходит по результатам каждого запроса изменения спейса в пределах транзакции.
Итератор будет содержать:
- порядковый номер запроса,
- старое значение кортежа до запроса (для запросов вставки это будет нулевое значение nil),
- новое значение кортежа после запроса (для запросов удаления это будет нулевое значение nil),
- и идентификатор спейса.
Более сложный и более полезный пример: покажет результат двух запросов замены:
box.space.test:drop() s = box.schema.space.create('test') i = box.space.test:create_index('i') function f(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[1]) .. ' ' .. old_tuple[2]) print(' new_tuple ' .. tostring(new_tuple[1]) .. ' ' .. new_tuple[2]) print(' space_id ' .. tostring(space_id)) end end s:insert{1,'-'} box.begin() s:replace{1,'x'} s:replace{1,'y'} box.on_commit(f) box.commit()
Результат будет выглядеть следующим образом:
tarantool> box.begin() s:replace{1,'x'} s:replace{1,'y'} box.on_commit(f) box.commit() request_number 1 old_tuple 1 - new_tuple 1 x space_id 517 request_number 2 old_tuple 1 x new_tuple 1 y space_id 517