Откат транзакции
> Объясните, пожалуйста, почему при добавлении нового имени транзакция не откатывается, хотя такое имя уже есть в таблице PersonPhone
Задание. Выполните ряд записей вставки в виде транзакции в хранимой процедуре. Если такой сотрудник имеется откатите базу данных обратно.
Условие отката:
IF EXISTS (SELECT * FROM PersonPhone WHERE pname = name AND id != Id)
THEN
ROLLBACK;
последний выполненный инкремент @@identity хранится в переменной Id и сравнивается после вставки с id таблицы PersonPhone, если имена одинаковые, но разные айди, то такая транзакция откатывается. Но при выполнении одинаковые имена записываются в таблицу
create table PersonPhone(id int auto_increment primary key, pname varchar(15), pnumber varchar(15) );
insert into PersonPhone(id, pname, pnumber ) values
(1, 'Andrey', null),
(2, 'Mik', '26-23-11'),
(3, 'Luk', '27-34-25'),
(4, 'Lena', '34-54-32'),
(5, 'Bella', '46-75-88'),
(6, 'Karina', '21-90-50');
DELIMITER |
DROP PROCEDURE MyTransactProc; |
CREATE PROCEDURE MyTransactProc (IN name varchar(25))
BEGIN
DECLARE Id int;
START TRANSACTION;
INSERT PersonPhone (pname)
VALUES (name);
SET Id = @@IDENTITY;
IF EXISTS (SELECT * FROM PersonPhone WHERE pname = name AND id != Id)
THEN
ROLLBACK;
END IF;
COMMIT;
END; |
CALL MyTransactProc ( 'Bella'); |
SELECT * FROM PersonPhone; |