Sql Mariadb StoredProcess是否始终需要启动事务?

Sql Mariadb StoredProcess是否始终需要启动事务?,sql,stored-procedures,transactions,mariadb,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 D

我有一个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;

我的问题是,我是否需要将start事务放在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命令完成时启动事务。

如果,为什么要使用
?只需这样写:

DELETE FROM category
    WHERE id = IN_category_uuid AND
          NOT EXISTS (SELECT 1 FROM products p WHERE p.categoryId = IN_category_uuid);
您可能不需要将其包装到事务中,但这可能取决于数据库的设置。一般来说,单个命令将位于其自己的事务中(实际上没有太多可回滚的内容)