Всегда ли требуется начинать транзакцию с помощью Mariadb storedprocedure?

#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);
 

Вероятно, вам не нужно заключать это в транзакцию, но это может зависеть от настроек базы данных. В общем, одна команда будет находиться в своей собственной транзакции (и на самом деле отката не так много).