Итак, вот хранимая процедура, которую я написал. Когда я побежал DELETE
и UPDATE
в одной вкладке SQLMySQL Transaction возвращает ошибку
как:
DELETE FROM curriculumsubjects WHERE curriculumId = 27;
INSERT INTO curriculumsubjects(curriculumId,subjectCode)
VALUES(27,'MATH101');
это работает. Он выполняет delete
и insert
без проблем
Но если я позвоню хранимой процедуры, как:
CALL `enrollmentdb`.`updateCurriculumSubjects`(27, 'MATH101');
возвращает 'error'
строку я положил во ROLLBACK
Что может быть причиной провала сделки в пределах тела хранимой процедуры, когда он успешно работает, если выполняется без хранимой процедуры CALL
?
Вот хранимая процедура.
CREATE DEFINER=`root`@`localhost` PROCEDURE `updateCurriculumSubjects`(IN p_curriculumId int, IN p_subjectCode varchar(100))
BEGIN
DECLARE hasError BOOLEAN DEFAULT 0;
DECLARE CONTINUE HANDLER FOR sqlexception SET hasError = 1;
START TRANSACTION;
DELETE FROM curriculumsubjects WHERE curriculumId = p_curriculumId;
INSERT INTO curriculumsubjects(curriculumId,subjectCode)
VALUES(p_curriculumId,p_subjCode);
IF hasError THEN
ROLLBACK;
SELECT 'error';
ELSE
COMMIT;
END IF;
END
Кстати, я использую MySQL Workbench 6.3 и то, что я пытаюсь сделать, это удалить все столбцы, соответствующие curriculumId, прежде чем вставить снова.
На Java я буду повторять вызов хранимой процедуры для нескольких вставок.
Надеюсь, вы сможете помочь. Я просто не могу найти причину, по которой delete
и insert
не будут работать, если они будут помещены в транзакцию.
Спасибо.
Было бы проще, если бы вы сделали правильную отладку и определили точное число ошибок в обработчике продолжения, отменив его. – Shadow
Попробуйте удалить код обработки ошибок и запустите хранимую процедуру только с удалением/вставкой и посмотрите, какая ошибка возникает. –