Транзакция — последовательность операций, выполняемых в логическом порядке пользователем, либо программой, которая работает с БД. Это распространение изменений в БД. Например, если мы взаимодействуем с записью, то мы выполняем транзакцию. Крайне важно контролировать транзакции для гарантирования.
Основные концепции транзакции описываются аббревиатурой ACID –
- Atomicity — Атомарность
- Consistency — Согласованность
- Isolation — Изолированность
- Durability — Долговечность
Атомарность
Атомарность — гарантирует, что любая транзакция будет зафиксирована только целиком. Если одна из операций в последовательности не будет выполнена, то вся транзакция будет отменена. Тут вводится понятие rollback — внутри последовательности будут происходить определённые изменения, но по итогу все они будут откачены и по итогу пользователь не увидит никаких изменений.
Согласованность
Согласованность — любая завершённая транзакция (end of transaction) фиксирует только допустимые результаты. Например, при переводе денег с одного счёта на другой, в случае, если деньги ушли с одного счёта, они должны прийти на другой (это согласованность системы). Списание и зачисление – это две разные транзакции, поэтому первая транзакция пройдёт без ошибок, а второй просто не будет. Именно поэтому крайне важно учитывать это свойство и поддерживать баланс системы.
Изолированность
Изолированность — Каждая транзакция должна быть изолирована от других, т.е. её результат не должен зависеть от выполнения других параллельных транзакций. На практике, изолированность крайне труднодостижимая вещь, поэтому здесь вводится понятие “уровни изолированности” (транзакция изолируется не полностью).
Долговечность
Эта концепция гарантирует, что если мы получили подтверждение о выполнении транзакции, то изменения, вызванные этой транзакцией не должны быть отменены из-за сбоя системы (например, отключение электропитания).
Примеры
--transaktsiooni loomine
begin transaction
insert into T (id, s) values(4,'fourth');
select * from T;
--tegevuse tagasi võtmine
rollback;
SELECT * FROM T;

start transaction;
insert into T (id, s) values(4,'fourth');
select * from T;
ROLLBACK;
select * from T;


--loome transaktiooni, mis võtab tagasi kustutatud kirjed
BEGIN TRANSACTION;
DELETE FROM T where id>1;
SELECT * FROM T;
--tegevuse tagasi võtmine
ROLLBACK;
SELECT * FROM T;

SET AUTOCOMMIT = 0;
DELETE FROM T WHERE id > 1;
COMMIT;
INSERT INTO T (id, s) VALUES (6, 'sixth');
INSERT INTO T (id, s) VALUES (7, 'seventh');
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;

