问题
纯粹出于学术原因,我想知道您是否可以向 mysql 存储过程添加一个处理程序,如果其中一个查询锁定(例如SELECT ... FOR UPDATE
or UPDATE
)查询,该处理程序能够从锁定等待超时错误中恢复。
这个例子
这是假设一个 innoDB 数据库,设置为隔离级别Repeatable read
,定义了一个空users
表。
1. 示例程序:
DROP PROCEDURE IF EXISTS `lock_test`;
DELIMITER ;;
CREATE PROCEDURE `lock_test`(OUT status ENUM('success','timeout'))
MODIFIES SQL DATA
BEGIN
START TRANSACTION;
SELECT * FROM `users` FOR UPDATE;
SET status := 'success';
COMMIT;
END;;
DELIMITER ;
2.在mysql终端1中运行代码:
START TRANSACTION;
SELECT * FROM `users` FOR UPDATE;
- 的内容
users
将被显示,但交易将保持打开状态。
3、在mysql终端2中运行代码:
CALL `lock_test`(@out);
SELECT @out;
- 事务将一直运行直到超时(默认值为
innodb_lock_wait_timeout
50 秒)
是否可以在过程中添加一个处理lock_test()
程序,以便我们可以让@out 保持“超时”?