Mysql
如果儲存過程呼叫另一個儲存過程,則回滾不起作用
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
沒有什麼可以“回滾”。