SQL Transactions

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 пример