Mysql

如果儲存過程呼叫另一個儲存過程,則回滾不起作用

  • February 13, 2020

stored procedure如果我在內部呼叫 astored procedure會自動送出,這是預期的行為嗎?

例子:

偽過程 proc1

create procedure proc1(in var1 int, out var2 int)
begin
 start transaction;
 -- some code here
 commit;
end

偽過程proc2,將呼叫proc1

create procedure proc2()
lbl_begin:
begin
 start transaction;
   -- modify some data here
   call proc1(0, var2);

   if var != 0 then
     rollback;
     leave lbl_begin;
   end;
 commit;
end;

即使執行了 proc2 上的回滾,在呼叫 proc1 之前修改的數據仍然被送出。

它是一個錯誤還是它的預期行為?

開始事務會導致送出任何待處理的事務。有關更多資訊,請參閱第 13.3.3 節,“導致隱式送出的語句”。

https://dev.mysql.com/doc/refman/8.0/en/commit.html

事務不能嵌套。這是當您發出 START TRANSACTION 語句或其同義詞之一時對任何目前事務執行的隱式送出的結果。

https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html

也就是說,proc1 的START關閉 proc2 的START

第一個ROLLBACK關閉唯一打開的事務,因此第二個ROLLBACK沒有什麼可以“回滾”。

引用自:https://dba.stackexchange.com/questions/259202