Mysql
在不送出或回滾事務的情況下離開/退出儲存過程是否安全?
像下面的程式碼那樣安全嗎?
create definer=`root`@`%` procedure `test`() label: begin declare exit handler for sqlexception rollback; start transaction; select condition from table where id = someid for update; if condition = false then leave label; end if; // some query; commit; end$$
我認為事務控制根本不屬於儲存過程,除了一些非常特殊的情況(例如,無論“外部”事務發生什麼,即“自治事務”),您都希望記錄審計記錄。該過程無法知道它是否是更大工作單元的一部分,因此,如果它送出或回滾,它可能會違反更大事務的一致性規則。
在實施業務規則的級別送出或回滾。
換句話說,是的,在大多數情況下,“在不送出或回滾的情況下離開/退出儲存過程”並讓呼叫者決定是正確的做法(前提是如果發生異常,您不隱藏異常)。
正如我對問題的評論所提到的,答案是“否”,尤其是
FOR UPDATE
它會一直保持鎖定直到呼叫COMMIT
or 。ROLLBACK