SQL transaktsioonid

Транзакция – это последовательность операций, выполняемых в логическом порядке пользователем, либо программой, которая работает с БД.

Транзакция – это распространение изменений в БД. Например, если мы создаём, изменяем или удаляем запись, то мы выполняем транзакцию. Крайне важно контролировать транзакции для гарантирования.

Основные концепции транзакции описываются аббревиатурой ACID 

  • Atomicity – Атомарность
  • Consistency – Согласованность
  • Isolation – Изолированность
  • Durability – Долговечность

Атомарность

гарантирует, что любая транзакция будет зафиксирована только целиком (полностью). Если одна из операций в последовательности не будет выполнена, то вся транзакция будет отменена. Тут вводится понятие “отката” (rollback). Т.е. внутри последовательности будут происходить определённые изменения, но по итогу все они будут отменены (“откачены”) и по итогу пользователь не увидит никаких изменений.

Согласованность

Согласованность означает, что любая завершённая транзакция (транзакция, которая достигла завершения транзакции – end of transaction) фиксирует только допустимые результаты. Например, при переводе денег с одного счёта на другой, в случае, если деньги ушли с одного счёта, они должны прийти на другой (это и есть согласованность системы). Списание и зачисление  – это две разные транзакции, поэтому первая транзакция пройдёт без ошибок, а второй просто не будет. Именно поэтому крайне важно учитывать это свойство и поддерживать баланс системы.

Изолированность

Каждая транзакция должна быть изолирована от других, т.е. её результат не должен зависеть от выполнения других параллельных транзакций. На практике, изолированность крайне труднодостижимая вещь, поэтому здесь вводится понятие “уровни изолированности” (транзакция изолируется не полностью).

Долговечность

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

Для управления транзакциями используются следующие команды:

  • COMMIT
    Сохраняет изменения
  • ROLLBACK
    Откатывает (отменяет) изменения
  • SAVEPOINT
    Создаёт точку к которой группа транзакций может откатиться
  • SET TRANSACTION
    Размещает имя транзакции.

MySQL по умолчанию работает в режиме AUTOCOMMIT. Это означает, что если вы не начали транзакцию явным образом, каждый запрос автоматически выполняется в отдельной транзакции.

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

SET AUTOCOMMIT = 1;

Значения 1 и ON эквивалентны, так же как и 0 и OFF.

После отправки запроса в режиме AUTOCOMMIT=0 вы оказываетесь в транзакции, пока не выполните команду COMMIT или ROLLBACK. После этого MySQL немедленно начинает новую транзакцию. 

————————————————————————–

По умолчанию, в SQL Server сессии работают в режиме AUTOCOMMIT (автоматической фиксации) и использования явных транзакций, мы можем построить транзакции нескольких SQL-команд.

Тем не менее, весь сервер может быть настроен на использование и неявных транзакций. Но возможно использование неявных транзакций и только в одной сессии SQL, что можно настроить с помощью следующей команды SQL

SET IMPLICIT_TRANSACTIONS ON;

которая будет в силе до конца сессии, но при необходимости её можно будет выключить следующей командой:

SET IMPLICIT_TRANSACTIONS OFF;

SQL SERVER

Пример, где отслеживали операцию и использовали ROLLBACK

CREATE DATABASE transactionTargv24;
use transactionTargv24;

-- create table T 
CREATE TABLE T(
id int not null Primary Key,
s varchar(40),
si smallint)

-- add andmed
INSERT INTO T(id,s) VALUES (1, 'first');
INSERT INTO T(id,s) VALUES (2, 'second');
INSERT INTO T(id,s) VALUES (3, 'third');

-- Select
SELECT * FROM T;

-- tagasi võtmine
ROLLBACK;

-- Meil on vaja alusta transaktiooni
-- Alustame transaktiooni
BEGIN TRANSACTION
INSERT INTO T(id, s) VALUES (4, 'forth');
SELECT * FROM T;

-- tagsi võtmine
ROLLBACK;
SELECT * FROM T;

-- kustatame transaktiooni mis suurem kui 1
BEGIN TRANSACTION
DELETE FROM T WHERE id > 1;
SELECT * FROM T;

--transaktion mis salvestab uuendamine ja võtab tagasi (UPDATE)
BEGIN TRANSACTION
UPDATE T SET si = 3;
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;

Просто ROLLBACK не работает

Используем через транзакцию добавления

Используем ROLLBACK

На удаление

Используем ROLLBACK

На обновление и использования сразу ROLLBACK

XAMPP

Создаем базу данных, точно такую же как в SQL Server, затем создаюсь таблицу t

Начинаем создавать транзакцию на ввод данных. Отличия от SQL server – begin меняем на – START

После фразы START TRANSACTION; – обязательно точка с запятой

Получаем результат в двух select – один что добавили запись в торой что откатили ее назад (rollback)

Немного ниже мы видим

Кoммит в этой версии myadmin не работает!!!!!

NB!!! – тут мы пробуем в скринах запускать все по отдельности, далее будет более лучший вариант

Весь запрос в одном запросе, где мы хотели удалить Id все больше чем 1

Получаем результат

Далее уложняем запрос с помощью savepoint

NB! обазательно после каждой позиции записываем в select чтобы потом это изменять

Результат в 3 select которые мы вызывали далее (первый запрос сохраняет savepoint)

Во втором select – делаем update и получаем результат нашего update

А третьем select – мы возращаем спощью rollback обратно в нашу сохраненую точку (которая была на первом select)

DBeaver

MARIA DB