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

Модуль net.box

Модуль net.box содержит коннекторы к удаленным системам баз данных. Один из вариантов предназначен для подключения к MySQL, MariaDB или PostgreSQL (см. справочник модулей СУБД SQL). Другой вариант, рассматриваемый в этом разделе, предназначен для подключения к экземплярам сервера Tarantool по сети.

Подключение к базе данных с помощью net.box

Примеры на GitHub: sample_db, net_box

В этом руководстве показано, как использовать net.box для подключения к удаленному экземпляру Tarantool, выполнения операций CRUD и вызова хранимых процедур. Подробнее об API модуля net.box см. net_box-module.

Конфигурация тестовой базы данных

В этом разделе описана конфигурация тестовой базы данных, допускающая удаленные подключения:

credentials:  users:    sampleuser:      password: '123456'      privileges:      - permissions: [ read, write ]        spaces: [ bands ]      - permissions: [ execute ]        functions: [ get_bands_older_than ]groups:  group001:    replicasets:      replicaset001:        instances:          instance001:            iproto:              listen:              - uri: '127.0.0.1:3301'app:  file: 'myapp.lua'
  • Конфигурация содержит один экземпляр, принимающий входящие запросы на адресе 127.0.0.1:3301.

  • У пользователя sampleuser есть привилегии на выборку и изменение данных в спейсе bands и вызов хранимой функции get_bands_older_than. Этого пользователя можно использовать для удаленного подключения к экземпляру.

  • myapp.lua определяет модель данных и хранимую функцию. Файл myapp.lua выглядит следующим образом:

-- Create a space --box.schema.space.create('bands')-- Specify field names and types --box.space.bands:format({    { name = 'id', type = 'unsigned' },    { name = 'band_name', type = 'string' },    { name = 'year', type = 'unsigned' }})-- Create indexes --box.space.bands:create_index('primary', { parts = { 'id' } })box.space.bands:create_index('band', { parts = { 'band_name' } })box.space.bands:create_index('year_band', { parts = { { 'year' }, { 'band_name' } } })-- Create a stored function --box.schema.func.create('get_bands_older_than', {    body = [[    function(year)        return box.space.bands.index.year_band:select({ year }, { iterator = 'LT', limit = 10 })    end    ]]})

Полный пример доступен на GitHub: sample_db.

Интерактивное выполнение запросов net.box

Чтобы опробовать запросы net.box в интерактивной консоли, запустите приложение sample_db с помощью tt start:

$ tt start sample_db

Затем запустите интерактивную консоль с помощью команды tt run -i:

$ tt run -iTarantool 3.0.0-entrypoint-1144-geaff238d9type 'help' for interactive helptarantool>

В консоли можно создать подключение net.box и опробовать операции с данными.

Создание подключения net.box

Чтобы загрузить модуль net.box, используйте директиву require():

Чтобы создать подключение, передайте URI базы данных в метод net_box.connect():

conn = net_box.connect('sampleuser:123456@127.0.0.1:3301')--[[---...]]

Для проверки состояния подключения можно использовать connection:ping():

conn:ping()--[[---- true...]]

Затем можно получить объект спейса и выполнять с ним операции CRUD, используя conn.space.<space_name>.

Вставка данных

В примере ниже в спейс bands добавляются четыре кортежа:

conn.space.bands:insert({ 1, 'Roxette', 1986 })--[[---- - [1, 'Roxette', 1986]...]]conn.space.bands:insert({ 2, 'Scorpions', 1965 })--[[---- [2, 'Scorpions', 1965]...]]conn.space.bands:insert({ 3, 'Ace of Base', 1987 })--[[---- [3, 'Ace of Base', 1987]...]]conn.space.bands:insert({ 4, 'The Beatles', 1960 })--[[---- [4, 'The Beatles', 1960]...]]

Запрос данных

В примере ниже показано, как получить кортеж по указанному значению первичного ключа:

conn.space.bands:select({ 1 })--[[---- - [1, 'Roxette', 1986]...]]

Также можно получить кортеж по значению указанного индекса следующим образом:

conn.space.bands.index.band:select({ 'The Beatles' })--[[---- - [4, 'The Beatles', 1960]...]]

Обновление данных

space_object.update() обновляет кортеж, идентифицируемый первичным ключом. Этот метод принимает полный ключ и операцию для выполнения:

conn.space.bands:update({ 2 }, { { '=', 'band_name', 'Pink Floyd' } })--[[---- [2, 'Pink Floyd', 1965]...]]

space_object.upsert() обновляет существующий кортеж или вставляет новый. В примере ниже вставляется новый кортеж:

conn.space.bands:upsert({ 5, 'The Rolling Stones', 1962 }, { { '=', 'band_name', 'The Doors' } })--[[---...]]

В этом примере space_object.replace() используется для удаления существующего кортежа и вставки нового:

conn.space.bands:replace({ 1, 'Queen', 1970 })--[[---- [1, 'Queen', 1970]...]]

Удаление данных

Вызов space_object.delete() в примере ниже удаляет кортеж, значение первичного ключа которого равно 5:

conn.space.bands:delete({ 5 })--[[---- [5, 'The Rolling Stones', 1962]...]]

Выполнение хранимых процедур

Чтобы выполнить хранимую процедуру, используйте метод connection:call():

conn:call('get_bands_older_than', { 1966 })-- ----- - [[2, 'Pink Floyd', 1965], [4, 'The Beatles', 1960]]-- ...

Закрытие соединения

Метод connection:close() можно использовать для закрытия соединения, когда оно больше не нужно:

conn:close()--[[---...]]

Общие сведения

Можно вызвать следующие методы:

  • require('net.box') – для получения объекта net.box (в примерах этого раздела он называется net_box)
  • net_box.connect() – для подключения и получения объекта соединения (в примерах этого раздела он называется conn)
  • другие методы net.box(), вызываемые с передачей conn:, для выполнения запросов к удаленной системе баз данных
  • conn:close – для отключения

Все методы net.box безопасны для файберов, то есть можно безопасно обмениваться и использовать один и тот же объект подключения в нескольких файберах одновременно. Фактически так лучше всего работать в Tarantool. Когда несколько файберов используют одно соединение, все запросы передаются по одному сетевому сокету, но каждый файбер получает правильный ответ. Уменьшение количества активных сокетов снижает затрату ресурсов на системные вызовы и увеличивает общую производительность сервера. Однако, в некоторых случаях отдельного соединения недостаточно — например, когда необходимо отдавать приоритет разным запросам или использовать различные идентификаторы при аутентификации.

В большинстве методов net.box можно использовать последний аргумент {options}, который может быть следующим:

  • {timeout=...}. Например, метод, последним аргументом которого является {timeout=1.5}, остановится через 1,5 секунды на локальном узле, хотя это не гарантирует остановку выполнения на удаленном серверном узле.

  • {buffer=...}. Пример см. в описании модуля buffer.

  • {is_async=...}. Например, метод, последним аргументом которого является {is_async=true}, не будет ожидать результата запроса. См. описание is_async.

  • {on_push=... on_push_ctx=...}. Для получения внеполосных сообщений. См. описание box.session.push().

  • {return_raw=...} (начиная с версии 2.10.0). Если установлено значение true, net.box возвращает данные ответа, обернутые в объект MsgPack, вместо декодирования в Lua. Значение по умолчанию — false. Пример см. в описании параметра ниже.

Диаграмма состояний

На диаграмме ниже представлены возможные состояния и варианты перехода из одного состояния в другое:

На этой диаграмме:

  • Метод net_box.connect() запускает рабочий файбер, который устанавливает соединение и запускает конечный автомат.

  • Конечный автомат переходит в состояние initial.

  • Аутентификация и загрузка схемы. Позже можно снова перейти в состояние fetch_schema из состояния active для перезагрузки схемы.

  • Состояние меняется на graceful_shutdown, когда конечный автомат получает событие box.shutdown от удаленного хоста (см. conn:on_shutdown()). После завершения всех ожидающих запросов конечный автомат переключается в состояние error (error_reconnect).

  • Транспорт переходит в состояние error в случае ошибки. Это может произойти, например, если сервер закрыл соединение. Если задан параметр reconnect_after, транспорт переходит в состояние error_reconnect вместо состояния error.

  • Метод conn.close() устанавливает состояние closed и завершает работу файбера. Если транспорт уже находится в состоянии error, close() ничего не делает.

Указатель

Ниже приведен перечень всех функций модуля net.box.

Имя

Назначение

net_box.connect()
net_box.new()
net_box.self

Создание подключения

conn:ping()

Выполнение команды PING

conn:wait_connected()

Ожидание активации или закрытия подключения

conn:is_connected()

Проверка активности или закрытия подключения

conn:wait_state()

Ожидание целевого состояния

conn:close()

Закрытие подключения

conn.space.space-name:select{field-value}

Выбор одного или нескольких кортежей

conn.space.space-name:get{field-value}

Выбор кортежа

conn.space.space-name:insert{field-value}

Добавление кортежа

conn.space.space-name:replace{field-value}

Добавление или замена кортежа

conn.space.space-name:update{field-value}

Обновление кортежа

conn.space.space-name:upsert{field-value}

Обновление кортежа

conn.space.space-name:delete{field-value}

Удаление кортежа

conn:eval()

Вычисление и выполнение выражения в строке

conn:call()

Вызов хранимой процедуры

conn:watch()

Подписка на события, рассылаемые удаленным хостом

conn:on_connect()

Определение триггера на подключение

conn:on_disconnect()

Определение триггера на отключение

conn:on_shutdown()

Определение триггера на завершение работы

conn:on_schema_reload()

Определение триггера на изменение схемы

conn:new_stream()

Создание потока

stream:begin()

Начало транзакции в потоке

stream:commit()

Фиксация транзакции в потоке

stream:rollback()

Откат транзакции в потоке

net_box.connect(URI [, {option[s]}])

Создание нового подключения. Подключение устанавливается по требованию во время первого запроса. Можно повторно установить подключение автоматически после отключения (см. ниже опцию reconnect_after). Возвращается объект conn, который поддерживает методы создания удаленных запросов, таких как select, update или delete.

Параметры:

  • URIURI целевого объекта подключения. Тип URI может быть string или table, как и для функции uri.parse(). Табличная форма используется для настройки параметров подключения. Подробнее см. на странице URI.

  • options (table) — поддерживаемые опции перечислены ниже:

    • user/password: две опции для подключения к удаленному хосту помимо URI. Например, вместо connect('username:userpassword@localhost:3301') можно написать connect('localhost:3301', {user = 'username', password='userpassword'}).

    • wait_connected: время ожидания подключения. По умолчанию подключение блокируется до его установления,

      но если указать wait_connected=false, подключение возвращается немедленно. Если указать это время ожидания, ожидание будет выполняться перед возвратом (wait_connected=1.5 означает ожидание не более 1,5 секунды).

    • reconnect_after: количество секунд ожидания перед повторным подключением.

      Значение по умолчанию, как и для других опций connect, — nil. Если значение reconnect_after больше нуля, экземпляр net.box будет пытаться переподключиться при потере соединения или неудачной попытке подключения. Это делает временные сбои в сети прозрачными для приложения. Повторное подключение выполняется автоматически в фоновом режиме, поэтому запросы, которые изначально завершаются неудачей из-за разрыва соединения, прозрачно повторяются. Количество повторных попыток не ограничено, повторные попытки подключения выполняются через указанный интервал (например, reconnect_after=5 означает, что попытки переподключения выполняются каждые 5 секунд). При явном закрытии подключения или удалении его сборщиком мусора Lua попытки переподключения прекращаются.

    • connect_timeout: количество секунд ожидания перед возвратом ошибки «error: Connection timed out».

    • fetch_schema: логическая опция, управляющая получением изменений схемы с сервера. По умолчанию: true.

      Если удаленные спейсы не используются, например, выполняются только call или eval, задайте значение false для параметра fetch_schema, чтобы избежать получения изменений схемы, которое в этом случае не требуется.

    • required_protocol_version: минимальная версия протокола IPROTO,

      поддерживаемая сервером. Если версия протокола IPROTO, поддерживаемая сервером, ниже указанной, подключение завершится с ошибкой. При required_protocol_version = 1 все подключения завершаются с ошибкой, если версия протокола IPROTO ниже 1.

    • required_protocol_features: указанные возможности протокола IPROTO,

      поддерживаемые сервером. Можно указать одну или несколько возможностей net.box из таблицы ниже. Если сервер не поддерживает указанные возможности, подключение завершится с ошибкой. При required_protocol_features = {'transactions'} все подключения завершаются с ошибкой, если на сервере transactions: false.

Возможность net.box

Назначение

Идентификатор возможности IPROTO

Версии IPROTO,

streams

Требует поддержки потоков на сервере

IPROTO_FEATURE_STREAMS

1 и новее

transactions

Требует поддержки транзакций на сервере

IPROTO_FEATURE_TRANSACTIONS

1 и новее

error_extension

Требует поддержки расширения MsgPack MP_ERROR на сервере

IPROTO_FEATURE_ERROR_EXTENSION

2 и новее

watchers

Требует поддержки удаленных наблюдателей на сервере

IPROTO_FEATURE_WATCHERS

3 и новее

Подробнее о возможностях IPROTO см. IPROTO_ID и ключ IPROTO_FEATURES.

Возвращает

объект conn

Тип возвращаемого значения

userdata

Примеры:

net_box = require('net.box')conn = net_box.connect('localhost:3301')conn = net_box.connect('127.0.0.1:3302', {wait_connected = false})conn = net_box.connect('127.0.0.1:3304', {    required_protocol_version = 4,    required_protocol_features = {'transactions', 'streams'},})

net_box.new(URI [, {option[s]}])

new() — синоним connect(). Сохранен для обратной совместимости. Подробнее см. в описании net_box.connect().

net_box.self

net_box.self — встроенное подключение к текущему экземпляру Tarantool. Оно создано с целью облегчить полиморфное использование API модуля net_box. Таким образом, conn = net_box.connect('localhost:3301') можно заменить на conn = net_box.self.

Однако есть важное отличие встроенного подключения от удаленного:

  • При встроенном подключении запросы, не изменяющие данные, не передают управление. При удаленном подключении, в соответствии с правилами неявной передачи управления, любой запрос может передать управление, и состояние базы данных может измениться к моменту возврата управления.
  • Все параметры, переданные в запрос (такие как is_async, on_push, timeout), игнорируются.

conn

conn:ping([options])

Выполнение команды проверки состояния PING.

Параметры:

  • options (table) — поддерживаемая опция — timeout={seconds}.

Возвращает

true в случае успеха, false в случае ошибки.

Тип возвращаемого значения

boolean

Пример:

net_box.self:ping({timeout = 0.5})

conn:wait_connected([timeout])

Ожидание активности или закрытия подключения.

Параметры:

  • timeout (number) — в секундах.

Возвращает

true при подключении, false при неудаче.

Тип возвращаемого значения

boolean

Пример:

net_box.self:wait_connected()

conn:is_connected()

Проверка активности или закрытия подключения.

Возвращает

true при подключении, false при неудаче.

Тип возвращаемого значения

boolean

Пример:

net_box.self:is_connected()

conn:wait_state(state[s][, timeout])

[с 1.7.2] Ожидание нужного состояния.

Параметры:

  • states (string) — целевые состояния.
  • timeout (number) — в секундах.

Возвращает

true при достижении целевого состояния, false при истечении времени ожидания или закрытии подключения.

Тип возвращаемого значения

boolean

Примеры:

-- бесконечное ожидание состояния 'active':conn:wait_state('active')-- ожидание не более 1,5 секунды:conn:wait_state('active', 1.5)-- бесконечное ожидание состояния `active` или `fetch_schema`:conn:wait_state({active=true, fetch_schema=true})

conn:close()

Закрытие подключения.

Объекты подключения удаляются сборщиком мусора в Lua, как и любой другой Lua-объект, поэтому удалять их явным образом необязательно. Однако, поскольку close() представляет собой системный вызов, лучше всего закрыть соединение явным образом, когда оно больше не используется, с целью ускорения работы сборщика мусора.

Пример:

conn:close()

conn.space.:select({field-value, ...} [, {options}])

conn.space.{имя-спейса}:select({...}) – это удаленный вызов, аналогичный локальному вызову box.space.{имя-спейса}:select({...}) (детали). В дополнение см. Модуль buffer и skip-header.

Пример:

conn.space.testspace:select({1,'B'}, {timeout=1})

conn.space.:get({field-value, ...} [, {options}])

conn.space.{имя-спейса}:get(...) – это удаленный вызов, аналогичный локальному вызову box.space.{имя-спейса}:get(...) (детали).

Пример:

conn.space.testspace:get({1})

conn.space.:insert({field-value, ...} [, {options}])

conn.space.{имя-спейса}:insert(...) – это удаленный вызов, аналогичный локальному вызову box.space.{имя-спейса}:insert(...) (детали). В дополнение см. Модуль buffer и skip-header.

Пример:

conn.space.testspace:insert({2,3,4,5}, {timeout=1.1})

conn.space.:replace({field-value, ...} [, {options}])

conn.space.{имя-спейса}:replace(...) – это удаленный вызов, аналогичный локальному вызову box.space.{имя-спейса}:replace(...) (детали). В дополнение см. Модуль buffer и skip-header.

Пример:

conn.space.testspace:replace({5,6,7,8})

conn.space.:update({field-value, ...} [, {options}])

conn.space.{имя-спейса}:update(...) – это удаленный вызов, аналогичный локальному вызову box.space.{имя-спейса}:update(...).

Пример:

conn.space.Q:update({1},{{'=',2,5}}, {timeout=0})

conn.space.:upsert({field-value, ...} [, {options}])

conn.space.{имя-спейса}:upsert(...) – это удаленный вызов, аналогичный локальному вызову box.space.{имя-спейса}:upsert(...) (детали). В дополнение см. Модуль buffer и skip-header.

conn.space.:delete({field-value, ...} [, {options}])

conn.space.{имя-спейса}:delete(...) – это удаленный вызов, аналогичный локальному вызову box.space.{имя-спейса}:delete(...) (детали). В дополнение см. Модуль buffer и skip-header.

conn:eval(Lua-string [, {arguments}, [ {options} ]])

conn:eval({Lua-строка}) оценивает и выполняет выражение в Lua-строке, которое может представлять собой любое выражение или несколько выражений. Требуются права на выполнение; если у пользователя таких прав нет, администратор может их выдать с помощью box.schema.user.grant({имя-пользователя}, 'execute', 'universe').

Чтобы гарантировать, что conn:eval вернет то, что возвращает выражение на Lua, начните Lua-строку со слова "return" (вернуть).

Примеры:

tarantool> -- Lua-строкаtarantool> conn:eval('function f5() return 5+5 end; return f5();')---- 10tarantool> -- Lua-строка, {аргументы}tarantool> conn:eval('return ...', {1,2,{3,'x'}})---- 1- 2- [3, 'x']tarantool> -- Lua-строка, {аргументы}, {параметры}tarantool> conn:eval('return {nil,5}', {}, {timeout=0.1})---- [null, 5]

conn:call(function-name [, {arguments} [, {options}]])

conn:call('func', {'1', '2', '3'}) – это удаленный вызов, аналогичный func('1', '2', '3'). Таким образом, conn:call представляет собой удаленный вызов хранимой процедуры. conn:call возвращает то, что возвращает функция.

Ограничение: вызванная функция не может вернуть функцию, например, если func2 определяется как function func2 () return func end, то conn:call(func2) вернет ошибку "error: unsupported Lua type 'function'".

Примеры:

tarantool> -- создание 2 функций с помощью conn:eval()tarantool> conn:eval('function f1() return 5+5 end;')tarantool> conn:eval('function f2(x,y) return x,y end;')tarantool> -- вызов первой функции без параметров и опцийtarantool> conn:call('f1')---- 10tarantool> -- вызов второй функции с двумя параметрами и одной опциейtarantool> conn:call('f2',{1,'B'},{timeout=99})---- 1- B

conn:watch(key, func)

Подписка на события, рассылаемые удаленным хостом.

Параметры:

  • key (string) — имя ключа события, на которое оформляется подписка
  • func (function) — функция обратного вызова, вызываемая при обновлении значения ключа

Возвращает

дескриптор наблюдателя. Дескриптор содержит один метод — unregister(), который отменяет регистрацию наблюдателя.

Подробнее о наблюдателях см. в разделе Функции для наблюдателей.

Метод имеет тот же синтаксис, что и функция box.watch(), используемая для локальной подписки на события.

Наблюдатели сохраняются при повторном подключении (см. параметр подключения reconnect_after). Все зарегистрированные наблюдатели автоматически подписываются заново при восстановлении соединения.

Если удаленный хост поддерживает наблюдателей, в peer_protocol_features соединения будет установлен ключ watchers. Подробнее см. в таблице возможностей net.box.

Пример 1:

Сервер:

-- Рассылка значения 42 для ключа 'foo'.box.broadcast('foo', 42)

Клиент:

conn = net_box.connect(URI)local log = require('log')-- Подписка на обновления ключа 'foo'.w = conn:watch('foo', function(key, value)    assert(key == 'foo')    log.info("The box.id value is '%d'", value)end)

Если наблюдатель больше не нужен, его можно отменить с помощью следующей команды:

w:unregister()

Пример 2:

Модуль net.box позволяет отслеживать обновления конфигурации, хранящейся в хранилище конфигураций на базе Tarantool, путем наблюдения за изменениями пути или префикса. В примере ниже conn:watch() используется для отслеживания обновлений конфигурации, хранящейся по пути /myapp/config/all:

net_box = require('net.box')local conn = net_box.connect('127.0.0.1:4401')local log = require('log')conn:watch('config.storage:/myapp/config/all', function(key, value)    log.info("Configuration stored by the '/myapp/config/all' key is changed")end)

Полный пример доступен здесь: config_storage.

request(... {is_async=...})

{is_async=true|false} – это опция, которую можно применить во всех запросах net_box, включая conn:call, conn:eval и запросы conn.space.space-name.

По умолчанию, is_async=false, что означает, что запросы будут синхронными для файбера. Файбер блокируется в ожидании ответа на запрос или до истечения времени ожидания. До версии Tarantool 1.10 единственным способом выполнения асинхронных запросов было использование отдельных файберов.

is_async=true означает, что запросы будут асинхронными для файбера. Запрос вызывает передачу управления, но файбер не входит в режим ожидания. Сразу же возвращается результат, но это будет не результат запроса, а объект, который может использовать вызывающая программа для получения результат запроса.

У такого сразу же возвращаемого объекта, который мы называем "future" (будущий), есть собственные методы:

  • future:is_ready() — возвращает true, когда результат запроса доступен;

  • future:result() — получает результат запроса (возвращает ответ или nil, если результат еще не готов или произошла ошибка);

  • future:wait_result(timeout) — ожидает доступности результата запроса и затем получает его, либо выбрасывает ошибку, если по истечении времени ожидания результат отсутствует;

  • future:discard() — отменяет объект. В обычной ситуации пользователь введет команду future=имя-запроса(...{is_async=true}), а затем либо цикл с проверкой future:is_ready() до тех пор, пока он не вернет true, и получением результата с помощью request_result=future:result(), либо же команду request_result=future:wait_result(...). Возможен вариант, когда клиент проверяет наличие внеполосных сообщений от сервера, вызывая в цикле pairs() – см. box.session.push().

    Можно использовать future:discard(), чтобы соединение забыло об ответе – если получен ответ для отброшенного объекта, то он будет проигнорирован, так что размер таблицы запросов будет уменьшен, а другие запросы будут выполняться быстрее.

Примеры:

-- Асинхронная вставка кортежа --tarantool> future = conn.space.bands:insert({10, 'Queen', 1970}, {is_async=true})---tarantool> future:is_ready()---- truetarantool> future:result()---- [10, 'Queen', 1970]

-- Итерация по спейсу с 10 записями для получения данных порциями по 3 записи --

tarantool> while true do    >     future = conn.space.bands:select({}, {limit=3, after=position,    >         fetch_pos=true, is_async=true})    >     result = future:wait_result()    >     tuples = result[1]    >     position = result[2]    >     if position == nil then break end    >     print('Chunk size: '..#tuples)    > endChunk size: 3Chunk size: 3Chunk size: 3Chunk size: 1

Как правило, {is_async=true} используется только при большой загрузке (более 100 000 запросов в секунду) и большой задержке чтения (более 1 секунды), или же при необходимости отправки нескольких одновременных запросов, которые собирают ответы (что иногда называется "отображение-свертка").

request(... {return_raw=...})

{return_raw=true} игнорируется для:

  • Методов, возвращающих nil: begin, commit, rollback, upsert, prepare.
  • index.count (возвращает число).

Для execute опция применяется только к данным (rows). Метаданные декодируются даже при {return_raw=true}.

Пример:

local c = require('net.box').connect(uri)local mp = c.eval('eval ...', {1, 2, 3}, {return_raw = true})mp:decode() -- {1, 2, 3}

Опция может быть полезна, если нужно передать ответ дальше без декодирования или с частичным декодированием. Использование объекта MsgPack может снизить нагрузку на сборщик мусора Lua.

conn:new_stream()

Создание потока.

Пример:

-- Запуск сервера для создания нового потокаlocal conn = net_box.connect('localhost:3301')local conn_space = conn.space.testlocal stream = conn:new_stream()local stream_space = stream.space.test

stream

stream:begin([txn_isolation])

Начало транзакции в потоке. Вместо прямого вызова метода можно также использовать методы call, eval или execute для работы с SQL-транзакцией.

Параметры:

stream:commit()

Фиксация транзакции в потоке. Вместо прямого вызова метода можно также использовать методы call, eval или execute для работы с SQL-транзакцией.

Примеры:

-- Начало транзакции в потокеstream:begin()-- В ранее созданном спейсе `accounts` с первичным ключом `test` изменяются поля 2 и 3stream.space.accounts:update(test_1, {{'-', 2, 370}, {'+', 3, 100}})-- Фиксация транзакции в потокеstream:commit()

stream:rollback()

Откат транзакции в потоке. Вместо прямого вызова метода можно также использовать методы call, eval или execute для работы с SQL-транзакцией.

Пример:

-- Тестирование отката для memtx-спейсаspace:replace({1})-- Select возвращает ранее добавленный кортеж, так как этот select относится к транзакции в потокеspace:select({})stream:rollback()-- Select возвращает пустой результат, выполнен откат транзакции в потокеspace:select({})

Триггеры

В модуле net.box можно использовать следующие триггеры:

conn:on_connect([trigger-function[, old-trigger-function]])

Определение триггера, исполняемого при установке нового соединения, когда аутентификация и получение схемы завершены в результате события, например net_box.connect.

Если функция триггера отправляет запросы net_box, они должны быть асинхронными ({is_async = true}). Попытка дождаться завершения запроса с помощью future:pairs() или future:wait_result() в функции триггера приведет к ошибке.

Если выполнение триггера завершается неудачей и возникает исключение, состояние соединения изменяется на 'error'. В этом случае соединение разрывается независимо от значения параметра reconnect_after. Может вызываться столько раз, сколько происходит переподключений, если значение reconnect_after больше нуля.

Параметры:

  • trigger-function (function) — функция триггера. Принимает объект conn в качестве первого аргумента.
  • old-trigger-function (function) — существующая функция триггера, которую нужно заменить на trigger-function.

Возвращает

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

conn:on_disconnect([trigger-function[, old-trigger-function]])

Определение триггера, исполняемого после закрытия соединения. Если функция с триггером вызывает ошибку, то ошибка записывается в журнал, в противном случае записей не будет. Выполнение прекращается после явного закрытия соединения или удаления сборщиком мусора в Lua.

Параметры:

  • trigger-function (function) — функция триггера. Принимает объект conn в качестве первого аргумента.
  • old-trigger-function (function) — существующая функция триггера, которую нужно заменить на trigger-function.

Возвращает

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

conn:on_shutdown([trigger-function[, old-trigger-function]])

Определение триггера для завершения работы при получении события box.shutdown.

Триггер запускается в новом файбере. Пока триггер on_shutdown() выполняется, соединение остается активным. Это означает, что callback-функция триггера может отправлять новые запросы.

После возврата из триггера соединение net.box переходит в состояние graceful_shutdown (подробнее см. диаграмму состояний). В этом состоянии отправка новых запросов не допускается. Соединение ожидает завершения всех незавершенных запросов.

После обработки всех выполняемых запросов соединение закрывается. Состояние изменяется на error или error_reconnect (если задан параметр reconnect_after).

Серверы, не поддерживающие событие box.shutdown или IPROTO_WATCH, просто разрывают соединение без предупреждения. В этом случае триггер on_shutdown() не выполняется.

Параметры:

  • trigger-function (function) — функция триггера. Принимает объект conn в качестве первого аргумента.
  • old-trigger-function (function) — существующая функция триггера, которую нужно заменить на trigger-function.

Возвращает

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

conn:on_schema_reload([trigger-function[, old-trigger-function]])

Определение триггера, исполняемого во время выполнения определенной операции на удаленном сервере после обновления схемы. Другими словами, если запрос к серверу не выполняется из-за ошибки несовпадения версии схемы, происходит перезагрузка схемы.

Если функция триггера отправляет запросы net_box, они должны быть асинхронными ({is_async = true}). Попытка дождаться завершения запроса с помощью future:pairs() или future:wait_result() в функции триггера приведет к ошибке.

Параметры:

  • trigger-function (function) — функция триггера. Принимает объект conn в качестве первого аргумента.
  • old-trigger-function (function) — существующая функция триггера, которую нужно заменить на trigger-function.

Возвращает

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

Подробная информация о триггерах приведена в разделе триггеры.