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)
, старый триггер будет удален.Подробная информация о характеристиках триггера находится в разделе Триггеры.
Example 1
-- Insert test data -- box.space.bands:insert { 1, 'Roxette', 1986 } box.space.bands:insert { 2, 'Scorpions', 1965 } box.space.bands:insert { 3, 'Ace of Base', 1987 } -- Define a function called on commit -- function print_commit_result() print('Commit happened') end -- Commit the transaction -- box.begin() box.space.bands:insert { 4, 'The Beatles', 1960 } box.on_commit(print_commit_result) box.commit()
Example 2
The function parameter can be an iterator. The iterator goes through the effects of every request that changed a space during the transaction.
The iterator has:
- an ordinal request number
- the old value of the tuple before the request
(
nil
for aninsert
request) - the new value of the tuple after the request
(
nil
for adelete
request) - the ID of the space
The example below displays the effects of two
replace
requests:-- Insert test data -- box.space.bands:insert { 1, 'Roxette', 1986 } box.space.bands:insert { 2, 'Scorpions', 1965 } box.space.bands:insert { 3, 'Ace of Base', 1987 } -- Define a function called on commit -- 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)) end end -- Commit the transaction -- 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()
The output might look like this:
request_number: 1 old_tuple: [1, 'Roxette', 1986] new_tuple: [1, 'The Beatles', 1960] space_id: 512 request_number: 2 old_tuple: [2, 'Scorpions', 1965] new_tuple: [2, 'The Rolling Stones', 1965] space_id: 512
- trigger-function (