Транзакция – это последовательность операций, выполняемых в логическом порядке пользователем, либо программой, которая работает с БД.
Транзакция – это распространение изменений в БД. Например, если мы создаём, изменяем или удаляем запись, то мы выполняем транзакцию. Крайне важно контролировать транзакции для гарантирования.
Основные концепции транзакции описываются аббревиатурой ACID –
- Atomicity – Атомарность
- Consistency – Согласованность
- Isolation – Изолированность
- Durability – Долговечность
Для управления транзакциями используются следующие команды:
- COMMIT
Сохраняет изменения - ROLLBACK
Откатывает (отменяет) изменения - SAVEPOINT
Создаёт точку к которой группа транзакций может откатиться - SET TRANSACTION
Размещает имя транзакции.
Таким образом, SQL транзакция может также рассматриваться в качестве элемента восстановления.
Преимущество команды ROLLBACK (в стандартном SQL) состоит в том, что когда запрограммированная в транзакции логика приложения не может быть завершена, то нет никакой необходимости в проведении серии обратных операций отдельными командами, работа может быть просто отменена командой ROLLBACK, действие которой будет всегда успешно выполняться. Незавершенные транзакции в случае разрыва соединения, завершения программы или отказа системы будут автоматически выполнять откат системы.
SQL SERVER MANAGEMENT:
CREATE TABLE T (
id INT NOT NULL PRIMARY KEY,
s varchar(40),
si smallint);
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 * FROM T;
ROLLBACK
BEGIN TRANSACTION
INSERT INTO T(id,s) VALUES(5, 'fourth');
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;
BEGIN TRANSACTION;
DELETE FROM T WHERE id > 1;
BEGIN TRANSACTION;
UPDATE T SET si=3;
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;
XAMPP:
CREATE TABLE T (
id INT NOT NULL PRIMARY KEY,
s varchar(40),
si smallint);
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 * FROM T;
ROLLBACK
START TRANSACTION
INSERT INTO T(id,s) VALUES(5, 'fourth');
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;
START TRANSACTION;
DELETE FROM T WHERE id > 1;
START TRANSACTION;
UPDATE T SET si=3;
SELECT * FROM T;
ROLLBACK;
SELECT * FROM T;
Ülesanne:
Таймкоды видео:
- 00:00 – Вступление
- 00:16 – Что такое транзакции
- 01:29 – Зачем нужны транзакции
- 03:59 – Авто коммит
- 10:57 – Execute транзакции
- 13:53 – Rollback транзакции
Человек использует MySQL Workbench, буду использовать SQL Server Management Studio (другие функции). Для начала создадим базу данных “TARgv24Transactions” и используем её.
CREATE DATABASE TARgv24Transactions;
USE TARgv24Transactions;
Разбор видео по фактам (без звука):
SET autocommit = 0 / 1
В данном случае 0 отключит автоматическую фиксацию транзакций, это значит, что каждый SQL-запрос (INSERT, UPDATE, DELETE) не коммитится автоматически сразу после выполнения. Вы сами решите когда сделать COMMIT или ROLLBACK, это может запросто заменить START/BEGIN TRANSACTION. По умолчанию значение стоит на 1.
START TRANSACTION;
SET @orderNumber = (select max(orderNumber)+1 from orders);
START TRANSACTION – Запуск транзакции, изменения не будут зафиксированы, пока не будет вписан COMMIT или отменены, пока не будет вписан ROLLBACK (в дальнейшем не будет упоминаться с целью экономии времени, пространства).
SET @orderNumber = (select max(orderNumber)+1 from orders) – Создаётся или переопределяется пользовательская переменная @orderNumber, которой присваивается максимальное значение orderNumber из таблицы (orders) + 1. Это используется для генерации следующего номера заказа.
*Тут в видео делается исполнение двух разных команд, но COMMIT один, после этого обе команды будут выполнены и останутся*
SET autocommit = 0;
START TRANSACTION;
DELETE FROM orderdetails;
SELECT * FROM orderdetails;
ROLLBACK;
Лично мне непонятен замысел данного хитроумного автокоммита, ведь запуск транзакции автоматически не даст принять изменения, пока мы не впишем COMMIT, или отменим ROLLBACK’ом (что и сделано в дальнейшем).
Начинем транзакцию, удаляем данные из таблицы orderdetails, после чего смотрим удалилось ли (удалилось), откатываем изменения ROLLBACK’ом.
Практическая часть (чето сделать надо):
Имеем уже готовую базу данных, что создали ранее. Создадим простую таблицу testProducts:
CREATE TABLE testProducts (
productID INT PRIMARY KEY NOT NULL,
productName VARCHAR(50),
productPrice INT NOT NULL)
Далее с помощью транзакции добавим данные в таблицу и закоммитим:
BEGIN TRANSACTION
INSERT INTO testProducts(productID,productName,productPrice) VALUES(1,'Test1',1500);
INSERT INTO testProducts(productID,productName,productPrice) VALUES(2,'Test2',1700);
INSERT INTO testProducts(productID,productName,productPrice) VALUES(3,'Test3',2000);
INSERT INTO testProducts(productID,productName,productPrice) VALUES(4,'Test4',1200);
INSERT INTO testProducts(productID,productName,productPrice) VALUES(5,'Test5',1000);
COMMIT;
Добавим значение и откатим его, при этом нам покажет сразу 2 таблицы (обновлённую и откаченную):
BEGIN TRANSACTION;
INSERT INTO testProducts(productID,productName,productPrice) VALUES(6,'Test6',1500);
SELECT * FROM testProducts;
ROLLBACK;
SELECT * FROM testProducts;
Важное уточнение:
В Microsoft SQL Server Management Studio отсутствует autocommit, вместо этого можно воспользоваться:
- BEGIN TRANSACTION – Создать транзакцию и коммитить, откатывать по своему желанию
- Переключить IMPLICIT_TRANSACTIONS, после чего каждое изменение будет требовать COMMIT или ROLLBACK
