我想要一个执行以下操作的存储过程:
锁定表格
检查其中的值
根据该值更新同一张表
解锁表格
如果1到4之间发生错误,表格会解锁吗?或者我需要以某种方式捕获错误? (工作原理)
有更好的方法吗?
答案 0 :(得分:2)
您无法在MySQL中的存储过程中锁定表。
存储例程中不允许的SQL语句
存储的例程不能包含任意SQL语句。不允许以下声明:
锁定语句
LOCK TABLES
和UNLOCK 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