#sql #stored-procedures #transactions #mariadb
Вопрос:
У меня есть база данных mariadb и хранимая процедура. Если оператор select имеет значение true, то выполняется запрос на удаление. Подобный этому:
START TRANSACTION;
# Test if category is in use by a product and IN_category_uuid is an input variable
IF ((SELECT COUNT(id) FROM products WHERE categoryId = IN_category_uuid) = 0) THEN
DELETE FROM category WHERE id = IN_category_uuid;
COMMIT;
SET OUT_result = 0;
ELSE
ROLLBACK;
SET OUT_result = 2;
END IF;
Мой вопрос в том, нужно ли мне размещать начальную транзакцию в начале перед оператором select или возможно следующее?
# Test if category is in use by a product
IF ((SELECT COUNT(id) FROM products WHERE categoryId = IN_category_uuid) = 0) THEN
START TRANSACTION;
DELETE FROM category WHERE id = IN_category_uuid;
COMMIT;
SET OUT_result = 0;
ELSE
SET OUT_result = 2;
END IF;
Этот второй код не требует отката и запускает транзакцию только при выполнении команды alter.
Ответ №1:
Зачем использовать an IF
? Просто напишите это как:
DELETE FROM category
WHERE id = IN_category_uuid AND
NOT EXISTS (SELECT 1 FROM products p WHERE p.categoryId = IN_category_uuid);
Вероятно, вам не нужно заключать это в транзакцию, но это может зависеть от настроек базы данных. В общем, одна команда будет находиться в своей собственной транзакции (и на самом деле отката не так много).