簡體   English   中英

如何處理錯誤,以便鎖定的表將在過程中解鎖?

[英]How do I handle errors so a locked table will unlock in a procedure?

我想要一個執行以下操作的存儲過程:

  1. 鎖定桌子

  2. 檢查其中的值

  3. 根據該值更新同一張表

  4. 解鎖桌子

如果錯誤在1到4之間發生,表格會被解鎖嗎? 還是我需要以某種方式捕獲錯誤? (怎么樣?)

有一個更好的方法嗎?

您不能在MySQL的存儲過程中鎖定表。

存儲例程中不允許使用SQL語句

存儲的例程不能包含任意SQL語句。 以下語句是不允許的:

鎖定語句LOCK TABLESUNLOCK 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM