3

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

  1. 锁定表

  2. 检查其中的值

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

  4. 解锁桌子

如果1到4之间出现错误,表会被解锁吗?还是我需要以某种方式捕获错误?(如何?)

有一个更好的方法吗?

4

2 回答 2

2

您不能在 MySQL 的存储过程中锁定表。

存储例程中不允许使用 SQL 语句

存储例程不能包含任意 SQL 语句。不允许以下陈述:

锁定语句LOCK TABLESUNLOCK TABLES.

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

如果您使用的是 InnoDB,那么您可以通过使用锁定读取来锁定感兴趣的行来实现您的目的SELECT ... FOR UPDATE。当您遇到错误并回滚事务时,行会自动解锁。

我在这个最近的回答中详细写了这个问题,其中涉及避免冲突插入的问题,但无论您是否知道您想要的行已经存在,或者它可能存在或不存在,基本概念都是相同的。

于 2013-09-17T20:56:08.707 回答
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
于 2013-09-17T20:25:40.600 回答