SQL transaktsioonid
Транзакция – это последовательность операций, выполняемых в логическом порядке пользователем, либо программой, которая работает с БД.
Транзакция – это распространение изменений в БД. Например, если мы создаём, изменяем или удаляем запись, то мы выполняем транзакцию. Крайне важно контролировать транзакции для гарантирования.
Основные концепции транзакции описываются аббревиатурой ACID –
- Atomicity – Атомарность
- Consistency – Согласованность
- Isolation – Изолированность
- Durability – Долговечность
Атомарность
гарантирует, что любая транзакция будет зафиксирована только целиком (полностью). Если одна из операций в последовательности не будет выполнена, то вся транзакция будет отменена. Тут вводится понятие “отката” (rollback). Т.е. внутри последовательности будут происходить определённые изменения, но по итогу все они будут отменены (“откачены”) и по итогу пользователь не увидит никаких изменений.
Согласованность
Согласованность означает, что любая завершённая транзакция (транзакция, которая достигла завершения транзакции – end of transaction) фиксирует только допустимые результаты. Например, при переводе денег с одного счёта на другой, в случае, если деньги ушли с одного счёта, они должны прийти на другой (это и есть согласованность системы). Списание и зачисление – это две разные транзакции, поэтому первая транзакция пройдёт без ошибок, а второй просто не будет. Именно поэтому крайне важно учитывать это свойство и поддерживать баланс системы.
Изолированность
Каждая транзакция должна быть изолирована от других, т.е. её результат не должен зависеть от выполнения других параллельных транзакций. На практике, изолированность крайне труднодостижимая вещь, поэтому здесь вводится понятие “уровни изолированности” (транзакция изолируется не полностью).
Долговечность
Эта концепция гарантирует, что если мы получили подтверждение о выполнении транзакции, то изменения, вызванные этой транзакцией не должны быть отменены из-за сбоя системы (например, отключение электропитания).
Для управления транзакциями используются следующие команды:
- COMMIT
Сохраняет изменения - ROLLBACK
Откатывает (отменяет) изменения - SAVEPOINT
Создаёт точку к которой группа транзакций может откатиться - SET TRANSACTION
Размещает имя транзакции.
Команды управление транзакциями используются только для DML команд: INSERT, UPDATE, DELETE. Они не могут быть использованы во время создания, изменения или удаления таблицы.
Любое успешное выполнение транзакции заканчивается командой COMMIT (фиксация), в то время как неудачное выполнение должно быть закончено командой ROLLBACK (откат), которая автоматически восстанавливает в базе данных все изменения, внесенные транзакцией.
Таким образом, SQL транзакция может также рассматриваться в качестве элемента восстановления.
Преимущество команды ROLLBACK (в стандартном SQL) состоит в том, что когда запрограммированная в транзакции логика приложения не может быть завершена, то нет никакой необходимости в проведении серии обратных операций отдельными командами, работа может быть просто отменена командой ROLLBACK, действие которой будет всегда успешно выполняться. Незавершенные транзакции в случае разрыва соединения, завершения программы или отказа системы будут автоматически выполнять откат системы.
Некоторые СУБД (SQL-сервер, MySQL/InnoDB, PostgreSQL) работают в режиме AUTOCOMMIT по умолчанию.
Это означает, что результат каждой отдельной команды SQL будет автоматически фиксироваться в базе данных, таким образом эффекты и/или изменения, выполненные в базе данных рассматриваемым оператором, не могут быть отменены до прежнего состояния.
Так, в случае ошибок приложение должно выполнить обратные операции для логической единицы работы, которые могут быть невозможными после операций параллельных (конкурирующих) SQL-клиентов.
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;
ОДИНОЧНЫЕ ТРАНЗАКЦИИ


Ülesanne transaktsioonid
SQL SERVER
Создаём таблицу и Добавляем людей:
create table person (
id int not null primary key,
name varchar(50) not null
)
insert into person values(101, 'akash')
insert into person values(102, 'samir')

Начинаем новую транзакцию:
begin transaction
insert into person values(103, 'hasan')
rollback;
Добавили Hasana (ID 103), но потом отменили это действие. Его нет в таблице.

Ещё раз, но теперь сохраняем:
begin transaction
insert into person values(103, 'hasan')
commit;
Опять добавили Hasana (ID 103), но теперь сохранили (commit) — он точно остался в таблице.
Ещё один rollback:
select * from person
rollback;
Посмотрели, кто в таблице (Hasan), но затем снова откатили (но это уже ничего не отменяет, потому что select
не меняет данные).

Хотели изменить имя, но передумали:
begin transaction
update person set name='sima' where id=103;
rollback;
Переименовали Hasana в Sima, но передумали и отменили — имя осталось “hasan”.


9. Удаление и сохранения:
begin transaction
delete person where id=103
save transaction sav1
Удалили Hasana, но создали точку сохранения sav1
, чтобы можно было вернуться к этому моменту.

Добавляем ещё людей:
begin transaction
insert into person values(105, 'hasan')
insert into person values(106, 'hasan')
insert into person values(107, 'hasan')
save transaction sav2;
select * from person;
Добавили 3 Hasan’а с разными ID. Сохранили ещё одну точку — sav2
. И посмотрели, кто в таблице (ID 105, 106, 107).

Откатились к sav1
:
rollback transaction sav1;
Вернулись в момент, где Hasan (103) был удалён, и ещё не было вставки 105, 106, 107.

XAMPP
Создаём таблицу и Добавляем людей:

Добовляем в таблицу и потом отктатываем назад




Опять добавили Hasana (ID 103), но теперь сохранили (commit) — он точно останется в таблице.


Хотели изменить имя, но передумали:




Удаление и сохранения:


Добавляем ещё людей:


Добавили 3 Hasan’а с разными ID. Сохранили ещё одну точку — sav2
. И посмотрели, кто в таблице (ID 105, 106, 107).
Откатились к sav
2:
ксожелению в xamppe не получается так как нужно.

