17:21
Команды управления транзакциями: BEGIN, COMMIT, ROLLBACK.

Курс по SQL

Урок 37: Команды управления транзакциями: BEGIN, COMMIT, ROLLBACK

В этом уроке мы подробно рассмотрим команды управления транзакциями в SQL: BEGIN, COMMIT и ROLLBACK. Эти команды позволяют начинать, фиксировать и отменять транзакции, обеспечивая целостность и согласованность данных в базе данных.

Команда BEGIN

Команда BEGIN используется для начала новой транзакции. Все последующие операции будут выполнены в рамках этой транзакции до тех пор, пока не будет выполнена команда COMMIT или ROLLBACK.

BEGIN TRANSACTION;

Команда COMMIT

Команда COMMIT используется для фиксации транзакции, подтверждающей все изменения, выполненные в рамках этой транзакции. После выполнения команды COMMIT изменения становятся постоянными и видимыми для других транзакций.

COMMIT;

Пример использования транзакции с COMMIT

Рассмотрим пример использования транзакции для перевода денег с одного счета на другой:

BEGIN TRANSACTION;

UPDATE Счета
SET Баланс = Баланс - 100
WHERE НомерСчета = '123';

UPDATE Счета
SET Баланс = Баланс + 100
WHERE НомерСчета = '456';

COMMIT;

Результат выполнения

Транзакция завершена успешно. Балансы счетов обновлены.

Команда ROLLBACK

Команда ROLLBACK используется для отмены транзакции, отменяющей все изменения, выполненные в рамках этой транзакции. После выполнения команды ROLLBACK база данных возвращается в состояние, которое было до начала транзакции.

ROLLBACK;

Пример использования транзакции с ROLLBACK

Рассмотрим пример, где произошла ошибка, и нам нужно отменить транзакцию:

BEGIN TRANSACTION;

UPDATE Счета
SET Баланс = Баланс - 100
WHERE НомерСчета = '123';

-- Произошла ошибка, отменяем транзакцию
ROLLBACK;

Результат выполнения

Транзакция отменена. Балансы счетов не изменены.

Полный пример использования транзакций

Рассмотрим полный пример использования транзакций для управления банковскими операциями:

BEGIN TRANSACTION;

-- Проверяем, достаточно ли средств на счете отправителя
IF (SELECT Баланс FROM Счета WHERE НомерСчета = '123') >= 200
BEGIN
 -- Переводим деньги
 UPDATE Счета
 SET Баланс = Баланс - 200
 WHERE НомерСчета = '123';

 UPDATE Счета
 SET Баланс = Баланс + 200
 WHERE НомерСчета = '456';

 -- Фиксируем транзакцию
 COMMIT;
END
ELSE
BEGIN
 -- Отменяем транзакцию
 ROLLBACK;
END;

Результат выполнения

Транзакция завершена успешно. Балансы счетов обновлены.

Упражнения

Упражнение 1: Использование транзакции для обновления данных

Создайте транзакцию для обновления зарплат всех сотрудников на 10%. Если количество сотрудников меньше 5, отмените транзакцию.

Решение:

BEGIN TRANSACTION;

IF (SELECT COUNT(*) FROM Сотрудники) >= 5
BEGIN
 UPDATE Сотрудники
 SET Зарплата = Зарплата * 1.1;

 COMMIT;
END
ELSE
BEGIN
 ROLLBACK;
END;

Объяснение: Мы создали транзакцию для обновления зарплат всех сотрудников на 10%. Если количество сотрудников меньше 5, транзакция отменяется.

Упражнение 2: Использование транзакции для удаления данных

Создайте транзакцию для удаления всех заказов, сделанных до 2022 года. Если количество таких заказов больше 100, отмените транзакцию.

Решение:

BEGIN TRANSACTION;

IF (SELECT COUNT(*) FROM Заказы WHERE Дата < '2022-01-01') <= 100
BEGIN
 DELETE FROM Заказы
 WHERE Дата < '2022-01-01';

 COMMIT;
END
ELSE
BEGIN
 ROLLBACK;
END;

Объяснение: Мы создали транзакцию для удаления всех заказов, сделанных до 2022 года. Если количество таких заказов больше 100, транзакция отменяется.

Упражнение 3: Использование транзакции для вставки данных

Создайте транзакцию для вставки новых записей о студентах. Если общее количество студентов после вставки превышает 500, отмените транзакцию.

Решение:

BEGIN TRANSACTION;

INSERT INTO Студенты (Имя, КурсID, Оценка)
VALUES ('Алексей', 1, 85), ('Ольга', 2, 90);

IF (SELECT COUNT(*) FROM Студенты) <= 500
BEGIN
 COMMIT;
END
ELSE
BEGIN
 ROLLBACK;
END;

Объяснение: Мы создали транзакцию для вставки новых записей о студентах. Если общее количество студентов после вставки превышает 500, транзакция отменяется.

Категория: SQL | Просмотров: 105 | Добавил: Admin | Рейтинг: 1.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *: