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

Триггеры

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

Чтобы связать событие с функцией обратного вызова, передайте её в соответствующую функцию обработки событий on_{event}:

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

У всех триггеров есть следующие особенности:

  • Триггеры определяются только пользователем admin.
  • Триггеры хранятся в памяти экземпляра Tarantool, а не в базе данных. Поэтому триггеры исчезают при остановке экземпляра. Чтобы сделать их постоянными, поместите определения функций и настройки триггеров в скрипт запуска Tarantool.
  • Накладные расходы на триггеры невелики. Если триггер не определен, они минимальны: лишь разыменование указателя и проверка. Если триггер определен, они эквивалентны накладным расходам на вызов функции.
  • Для одного события может быть назначено несколько триггеров. В этом случае триггеры выполняются в порядке, обратном порядку их определения.
  • Триггеры должны работать в контексте события, то есть использовать переменные, переданные как аргументы функции триггера. Триггеры не должны влиять на глобальное состояние программы или изменять объекты, не связанные с событием. Если триггер вызывает такие функции, как, например, os.exit() или box.rollback(), результат его выполнения не определен.
  • Триггеры заменяемы. Запрос на «переопределение триггера» означает передачу новой и старой функции триггера в одну из функций on_{event}.
  • Все функции on_{event} имеют параметры, являющиеся указателями на функции, и все они возвращают указатели на функции. Определение функции в Lua, такое как function f() x = x + 1 end, эквивалентно f = function () x = x + 1 end – в обоих случаях f получает указатель на функцию. И trigger = box.session.on_connect(f) эквивалентно trigger = box.session.on_connect(function () x = x + 1 end) – в обоих случаях trigger получает указатель на функцию, который был передан.
  • Любую функцию on_{event} можно вызвать без аргументов, чтобы получить список ее триггеров. Например, используйте box.session.on_connect(), чтобы получить таблицу всех функций-триггеров подключения.
  • Триггеры могут быть полезны при решении проблем с репликацией. Подробнее см. в разделе Решение конфликтов репликации.

Пример:

Здесь мы записываем события подключения и отключения в журнал сервера Tarantool.

log = require('log')function on_connect_impl() log.info("connected "..box.session.peer()..", sid "..box.session.id())endfunction on_disconnect_impl() log.info("disconnected, sid "..box.session.id())endfunction on_auth_impl(user) log.info("authenticated sid "..box.session.id().." as "..user)endfunction on_connect() pcall(on_connect_impl) endfunction on_disconnect() pcall(on_disconnect_impl) endfunction on_auth(user) pcall(on_auth_impl, user) endbox.session.on_connect(on_connect)box.session.on_disconnect(on_disconnect)box.session.on_auth(on_auth)