hinne 5 – https://www.youtube.com/watch?v=shkt9Z5Gz-U
Данная транзакция обновляет Maakond который написан не верно а так же изменяет фамилию
Но транзакция не выполняется потому что Поле PereNimi использует varchar(10) а фамилия на которую я пытаюсь изменить больше чем 10 буквы.
В связи с этим активируется блок Catch в котором нахотяся rollback и возвращает таблицу Aadress в то состояние которое она была до этого.
--Создание таблицы
CREATE TABLE Aadres(
id int not null Primary key,
Maakond varchar(40),
Tanav varchar(50),
MajaNr int);
CREATE TABLE Klient(
id int not null Primary key,
Nimi varchar(30),
PereNimi varchar(10));
--Добавление данных
INSERT INTO Aadres VALUES (1, 'Harjumaa', 'Viru', 22);
INSERT INTO Aadres VALUES (2, 'Harjumaa', 'Viru', 99);
INSERT INTO Aadres VALUES (3, 'HOrjumaa', 'Viru', 55);
SELECT * FROM Aadres;
INSERT INTO Klient VALUES (1, 'Anna', 'Oleks');
INSERT INTO Klient VALUES (2, 'Nastja', 'Kostjuk');
INSERT INTO Klient VALUES (3, 'Zhan-Gabriel', 'Gerke');
SELECT * FROM Klient;
--Создание Процедуры с транзакцией которая не будет выполнена исза ошибки
Create Procedure spUpdateAddressNegativ
as
Begin
Begin Try
Begin Transaction -- Начало транзакции
Update Aadres set Maakond = 'Harjumaa'
where id = 3 and Tanav = 'Viru'
Update Klient set PereNimi = 'Reshetnikova' -- Данная фамилия больше 10 букв поэтому оно не будет выполнено
where id = 3 and PereNimi = 'Gerke'
Commit Transaction -- фиксирует изменинения при успешном выполнении транзакции
Print('Commit Transaction') -- Принтует пользователю данных текст при успешном выполнении
End Try
Begin Catch -- Будет активирован этот блок если произойдёт какая-то либо ошибка в транцзакции
Rollback Transaction -- Возвращает всё в исходное состояние
Print('Rollback') -- Привнует если транзакция не была исполнена
End Catch
End
--Создание процедуры с транзакцией которая будет выполнена
Create Procedure spUpdateAddressPositiv
as
Begin
Begin Try
Begin Transaction -- Начала транзакции
Update Aadres set Maakond = 'Harjumaa'
where id = 3 and Tanav = 'Viru'
Update Klient set PereNimi = 'Evertson' -- Фамилия меньше 10 б, Транзакция будет успешна
where id = 3 and PereNimi = 'Gerke'
Commit Transaction-- фиксирует изменинения при успешном выполнении транзакции
Print('Commit')-- Принтует пользователю данных текст при успешном выполнении
End Try
Begin Catch-- Будет активирован этот блок если произойдёт какая-то либо ошибка в транцзакции
Rollback Transaction -- Возвращает всё в исходное состояние
Print('Rollback')-- Принтует если транзакция не была исполнена
End Catch
End


Работающая транзакция


XAMPP

BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'Rollback' AS Message;
END;
START TRANSACTION;
-- Проверка длины строк до обновления
IF CHAR_LENGTH(UusPereNimi) < 10 OR CHAR_LENGTH(UusMaakond) < 40 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'UusPereNimi or UusMaakond is too long';
END IF;
-- Обновляем таблицу Aadres
UPDATE Aadres
SET Maakond = UusMaakond
WHERE id = idOfRecord;
-- Обновляем таблицу Klient
UPDATE Klient
SET PereNimi = UusPereNimi
WHERE id = idOfRecord;
COMMIT;
SELECT 'Commit' AS Message;
END
PS. Если без IF делать то он протсто будет образать данные до подходящего кол-ва символов
Проверка работы



Rollback пример


