[英]How do I handle errors so a locked table will unlock in a procedure?
我想要一個執行以下操作的存儲過程:
鎖定桌子
檢查其中的值
根據該值更新同一張表
解鎖桌子
如果錯誤在1到4之間發生,表格會被解鎖嗎? 還是我需要以某種方式捕獲錯誤? (怎么樣?)
有一個更好的方法嗎?
您不能在MySQL的存儲過程中鎖定表。
存儲例程中不允許使用SQL語句
存儲的例程不能包含任意SQL語句。 以下語句是不允許的:
鎖定語句
LOCK TABLES
和UNLOCK TABLES
。— http://dev.mysql.com/doc/refman/5.6/en/stored-program-restrictions.html
如果您使用的是InnoDB,則可以通過使用SELECT ... FOR UPDATE
鎖定讀取來鎖定感興趣的行,從而實現您的目的。 當您遇到錯誤並回滾事務時,這些行將自動解鎖。
您是否考慮過使用帶有try-catch塊的事務? 看到這個:
BEGIN TRAN
SAVE TRAN S1 -- Savepoint so any rollbacks will only affect this transaction
BEGIN TRY
/* Do your work in here */
END TRY
BEGIN CATCH
ROLLBACK TRAN S1 -- rollback just this transaction
SET @ErrorMessage = ERROR_MESSAGE()
SET @Severity = ERROR_SEVERITY()
SET @State = ERROR_STATE()
RAISERROR(@ErrorMessage, @Severity, @State) -- re-throw error if needed
END CATCH
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.