Manticore поддерживает базовые транзакции для удаления и вставки данных в реальном времени и в percolate таблицы, за исключением случаев, когда попытка записи производится в распределенную таблицу, которая включает таблицу реального времени или percolate таблицу. Каждое изменение таблицы сначала сохраняется во внутреннем наборе изменений, а затем фактически фиксируется в таблице. По умолчанию каждая команда оборачивается в отдельную автоматическую транзакцию, делая это прозрачным: вы просто 'вставляете' что-то и можете видеть результат вставки после ее завершения, не беспокоясь о транзакциях. Однако это поведение можно явно контролировать, начиная и фиксируя транзакции вручную.
Транзакции поддерживаются для следующих команд:
Транзакции не поддерживаются для:
Обратите внимание, что транзакции в Manticore не стремятся обеспечить изоляцию. Цель транзакций в Manticore - позволить вам накапливать несколько записей и выполнять их все сразу при фиксации или откатывать их все при необходимости. Транзакции интегрированы с бинарным логом для обеспечения долговечности и согласованности.
SET AUTOCOMMIT = {0 | 1}
SET AUTOCOMMIT управляет режимом автозавершения в активной сессии. По умолчанию AUTOCOMMIT установлен в 1. При настройках по умолчанию вам не нужно беспокоиться о транзакциях, так как каждое выражение, вносящее изменения в любую таблицу, неявно оборачивается в отдельную транзакцию. Установка значения 0 позволяет управлять транзакциями вручную, что означает, что они не будут видны до тех пор, пока вы явно их не зафиксируете.
Транзакции ограничены одной таблицей реального времени или percolate таблицей, а также ограничены по размеру. Они атомарны, согласованы, чрезмерно изолированы и долговечны. Чрезмерно изолированы означает, что изменения невидимы не только для параллельных транзакций, но даже для самой текущей сессии.
START TRANSACTION | BEGIN
COMMIT
ROLLBACK
Оператор BEGIN (или его алиас START TRANSACTION) принудительно фиксирует любую ожидающую транзакцию, если она есть, и начинает новую.
Оператор COMMIT фиксирует текущую транзакцию, делая все ее изменения постоянными.
Оператор ROLLBACK откатывает текущую транзакцию, отменяя все ее изменения.
При использовании одной из конечных точек JSON /bulk ( пакетная вставка, пакетная замена, пакетное удаление ), вы можете принудительно зафиксировать пакет документов, добавив пустую строку после них.
insert into indexrt (id, content, title, channel_id, published) values (1, 'aa', 'blabla', 1, 10);
Query OK, 1 rows affected (0.00 sec)
select * from indexrt where id=1;
+------+------------+-----------+--------+
| id | channel_id | published | title |
+------+------------+-----------+--------+
| 1 | 1 | 10 | blabla |
+------+------------+-----------+--------+
1 row in set (0.00 sec)
Вставленное значение сразу становится видимым в следующем операторе 'select'.
set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
insert into indexrt (id, content, title, channel_id, published) values (3, 'aa', 'bb', 1, 1);
Query OK, 1 row affected (0.00 sec)
insert into indexrt (id, content, title, channel_id, published) values (4, 'aa', 'bb', 1, 1);
Query OK, 1 row affected (0.00 sec)
select * from indexrt where id=3;
Empty set (0.01 sec)
select * from indexrt where id=4;
Empty set (0.00 sec)
В этом случае изменения НЕ фиксируются автоматически. В результате вставки не видны, даже в той же сессии, поскольку они не были зафиксированы. Также, несмотря на отсутствие оператора BEGIN, транзакция неявно начинается.
Чтобы изменения стали видимыми, необходимо зафиксировать транзакцию:
commit;
Query OK, 0 rows affected (0.00 sec)
select * from indexrt where id=4;
+------+------------+-----------+-------+
| id | channel_id | published | title |
+------+------------+-----------+-------+
| 4 | 1 | 1 | bb |
+------+------------+-----------+-------+
1 row in set (0.00 sec)
select * from indexrt where id=3;
+------+------------+-----------+-------+
| id | channel_id | published | title |
+------+------------+-----------+-------+
| 3 | 1 | 1 | bb |
+------+------------+-----------+-------+
1 row in set (0.00 sec)
После оператора commit вставки становятся видимыми в таблице.
Используя BEGIN и COMMIT, вы можете явно определить границы транзакции, поэтому в этом случае не нужно беспокоиться об автозавершении.
begin;
Query OK, 0 rows affected (0.00 sec)
insert into indexrt (id, content, title, channel_id, published) values (2, 'aa', 'bb', 1, 1);
Query OK, 1 row affected (0.00 sec)
select * from indexrt where id=2;
Empty set (0.01 sec)
commit;
Query OK, 0 rows affected (0.01 sec)
select * from indexrt where id=2;
+------+------------+-----------+-------+
| id | channel_id | published | title |
+------+------------+-----------+-------+
| 2 | 1 | 1 | bb |
+------+------------+-----------+-------+
1 row in set (0.01 sec)