如何处理错误,以便锁定的表在程序中解锁?

时间:2013-09-17 20:15:41

标签: mysql sql stored-procedures

我想要一个执行以下操作的存储过程:

  1. 锁定表格

  2. 检查其中的值

  3. 根据该值更新同一张表

  4. 解锁表格

  5. 如果1到4之间发生错误,表格会解锁吗?或者我需要以某种方式捕获错误? (工作原理)

    有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您无法在MySQL中的存储过程中锁定表。

  

存储例程中不允许的SQL语句

     

存储的例程不能包含任意SQL语句。不允许以下声明:

     

锁定语句LOCK TABLESUNLOCK TABLES

     

- http://dev.mysql.com/doc/refman/5.6/en/stored-program-restrictions.html

如果您正在使用InnoDB,那么您可以通过使用SELECT ... FOR UPDATE和{{1}}锁定感兴趣的行来实现您的目的。当您遇到错误并回滚事务时,行将自动解锁。

我在locking reads中详细地写了这个问题,其中问题涉及避免冲突插入,但是如果你知道你想要的行已经存在,或者它是否可能存在,那么基本概念是相同的。

答案 1 :(得分:1)

您是否考虑过使用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