Транзакция — это логическая единица работы, состоящая из одной или нескольких команд DML (INSERT, UPDATE, DELETE), выполняемых как единое целое.
Основные команды управления транзакциями:
- COMMIT — сохраняет все изменения, сделанные в транзакции.
- ROLLBACK — отменяет все изменения, сделанные в текущей транзакции.
- SAVEPOINT — создаёт точку сохранения, к которой можно откатиться с помощью ROLLBACK.
- SET TRANSACTION — устанавливает параметры для текущей транзакции (например, имя, уровень изоляции).
⚠️ Эти команды применяются только к DML-операциям.
DDL-операции (CREATE, DROP, ALTER) не поддерживают управление транзакциями.
Поведение транзакций:
- Успешное выполнение транзакции должно завершаться COMMIT.
- Неудачное выполнение должно завершаться ROLLBACK.
- ROLLBACK автоматически откатывает изменения при:
- разрыве соединения,
- сбое программы,
- отказе системы.
Преимущества ROLLBACK:
- Не нужно вручную выполнять отмену каждой операции.
- Позволяет легко восстановить базу данных в исходное состояние.
AUTOCOMMIT (автофиксация):
- По умолчанию включён в некоторых СУБД:
- MySQL (InnoDB),
- PostgreSQL,
- SQL Server.
- Каждая команда автоматически фиксируется после выполнения.
- Невозможно откатить изменения без явного управления транзакцией.
- В случае ошибки требуется ручное восстановление логики, что сложно при параллельных запросах.
Назначение транзакций:
- Обеспечивают целостность данных.
- Используются как механизм восстановления после сбоев.
- Гарантируют атомарность — “всё или ничего”.
Ülesanne
Выполнение примера со страницы “Руководство по SQL. Транзакции”
Создаётся таблица accounts
CREATE TABLE accounts (
id INT PRIMARY KEY,
name VARCHAR(100),
balance INT
);
Добавляются данные:
INSERT INTO accounts VALUES (1, 'Alice', 1000), (2, 'Bob', 1000);
Выполняется транзакция перевода денег от Alice к Bob
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE name = 'Alice';
UPDATE accounts SET balance = balance + 100 WHERE name = 'Bob';
COMMIT TRANSACTION;
Проверь результат:

Для проверки ROLLBACK
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 5000 WHERE name = 'Alice'; -- ошибка, если баланс отрицательный не допускается
ROLLBACK;
SELECT * FROM accounts;

Конспект: Работа с транзакциями в MySQL и SQL Server
Введение
Транзакции в SQL позволяют обеспечить целостность данных, выполняя несколько операций как единое целое. Если транзакция завершается успешно, все изменения сохраняются, если происходит ошибка — изменения откатываются, что предотвращает появление неконсистентных данных в базе.
В данной работе мы изучим как работать с транзакциями в MySQL (XAMPP) и SQL Server, используя примеры с перевода денег между счетами.
Видео по которому сделано задание
Часть 1: SQL Server
Создание базы данных
CREATE DATABASE EmployeeDB;
USE EmployeeDB;
Создание таблиц
CREATE TABLE tblMailingAddress (
AddressId INT PRIMARY KEY,
EmployeeNumber INT,
HouseNumber NVARCHAR(50),
StreetAddress NVARCHAR(50),
City NVARCHAR(50),
PostalCode NVARCHAR(50)
);
CREATE TABLE tblPhysicalAddress (
AddressId INT PRIMARY KEY,
EmployeeNumber INT,
HouseNumber NVARCHAR(50),
StreetAddress NVARCHAR(50),
City NVARCHAR(50),
PostalCode NVARCHAR(50)
);
Данные в таблицы
INSERT INTO tblMailingAddress VALUES (1, 101, '#10', 'King Street', 'London', 'CR27DW');
INSERT INTO tblPhysicalAddress VALUES (1, 101, '#10', 'King Street', 'London', 'CR27DW');
2. Создание хранимой процедуры для работы с транзакциями
- Напишем хранимую процедуру для обновления данных в обеих таблицах в рамках одной транзакции:
CREATE PROCEDURE spUpdateAddress
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
-- Обновление данных в таблице MailingAddress
UPDATE tblMailingAddress
SET City = 'LONDON'
WHERE AddressId = 1 AND EmployeeNumber = 101;
-- Обновление данных в таблице PhysicalAddress
UPDATE tblPhysicalAddress
SET City = 'LONDON'
WHERE AddressId = 1 AND EmployeeNumber = 101;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- В случае ошибки откатить все изменения
ROLLBACK TRANSACTION;
END CATCH
END;
Выполнение хранимой процедуры:
EXEC spUpdateAddress;
Проверка изменений в обеих таблицах:

Тестирование ошибки: Модифицирую процедуру для имитации ошибки и отката транзакции:
ALTER PROCEDURE spUpdateAddress
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
UPDATE tblMailingAddress
SET City = 'LONDON12'
WHERE AddressId = 1 AND EmployeeNumber = 101;
UPDATE tblPhysicalAddress
SET City = 'LONDON LONDON'
WHERE AddressId = 1 AND EmployeeNumber = 101;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
END;
Выполняю процедуру снова и чтобы убедиться, что данные не изменились:
EXEC spUpdateAddress;
GO
SELECT * FROM tblMailingAddress;
SELECT * FROM tblPhysicalAddress;
GO

Часть 2: XAMPP (MySQL)
2. Создание базы данных и таблиц
- Создайте базу данных:
CREATE DATABASE EmployeeDB;
USE EmployeeDB;
Создание таблицы:
CREATE TABLE tblMailingAddress (
AddressId INT PRIMARY KEY,
EmployeeNumber INT,
HouseNumber VARCHAR(50),
StreetAddress VARCHAR(50),
City VARCHAR(50),
PostalCode VARCHAR(50)
);
CREATE TABLE tblPhysicalAddress (
AddressId INT PRIMARY KEY,
EmployeeNumber INT,
HouseNumber VARCHAR(50),
StreetAddress VARCHAR(50),
City VARCHAR(50),
PostalCode VARCHAR(50)
);

Вставляем данные в таблицы:
INSERT INTO tblMailingAddress VALUES (2, 101, '#10', 'King Street', 'London', 'CR27DW');
INSERT INTO tblPhysicalAddress VALUES (2, 101, '#10', 'King Street', 'London', 'CR27DW');
GO

. Выполнение транзакции
- Вставляем код для транзакции с обновлением данных в обеих таблицах:
START TRANSACTION;
-- Обновление данных в таблице MailingAddress
UPDATE tblMailingAddress SET City = 'LONDON' WHERE AddressId = 1 AND EmployeeNumber = 101;
-- Обновление данных в таблице PhysicalAddress
UPDATE tblPhysicalAddress SET City = 'LONDON' WHERE AddressId = 1 AND EmployeeNumber = 101;
COMMIT;

Для тестирования отката ошибок использовала следующий код:
START TRANSACTION;
UPDATE tblMailingAddress SET City = 'LONDON12' WHERE AddressId = 1 AND EmployeeNumber = 101;
-- Вторая строка вызывает ошибку из-за превышения длины
UPDATE tblPhysicalAddress SET City = 'LONDON LONDON' WHERE AddressId = 1 AND EmployeeNumber = 101;
ROLLBACK;

Проверяю изменения в обеих таблицах:
SELECT * FROM tblMailingAddress;
SELECT * FROM tblPhysicalAddress;

Описание проделанной работы
1. Создание базы данных и таблиц
- В обеих системах создаются таблицы для хранения данных о сотрудниках и их адресах.
2. Использование транзакций
- SQL Server использует хранимую процедуру для обновления данных в рамках одной транзакции. В случае ошибки происходит откат.
- В XAMPP (MySQL) транзакции выполняются с помощью команд
START TRANSACTION
,COMMIT
иROLLBACK
.
3. Тестирование ошибок
- В случае ошибок в обновлениях транзакция откатывается, и данные не изменяются.