我在 before 触发器中放置了一个 get_lock ,以防止在设置 rod 列时出现竞争情况。
触发前:
INSERT | evaluation_reports | BEGIN
DECLARE is_success TINYINT;
DECLARE lockstring VARCHAR(42);
SELECT CONCAT('EvaluationReportInsertLock',new.evaluations_id) into lockstring;
SELECT GET_LOCK(lockstring,1) into is_success;
IF is_success=1
THEN set new.rid = (select IFNULL(max(rid), 0) + 1 from evaluation_reports where evaluations_id = new.evaluations_id);
ELSE SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'failed to obtain lock; not continuing';
END IF;
END
触发后:
BEGIN
DECLARE lockstring VARCHAR(42);
SELECT CONCAT('EvaluationReportInsertLock',new.evaluations_id) into lockstring;
Do RELEASE_LOCK(lockstring) ;
END
现在,我的问题是如果由于某种原因锁没有释放会发生什么?如果REST API完成,锁会被释放吗?如果没有,我该怎么办?
我尝试使用 DBeaver 在没有一些非空值的情况下向表中插入一个条目,并且锁没有被释放,因为在执行触发器之前而不是在触发器之后。那么如何防止此类情况发生呢?
应该尽快发布,是什么阻止你这样做?
INSERT | evaluation_reports | BEGIN
DECLARE is_success TINYINT;
DECLARE lockstring VARCHAR(42);
SELECT CONCAT('EvaluationReportInsertLock',new.evaluations_id) into lockstring;
SELECT GET_LOCK(lockstring,1) into is_success;
IF is_success=1
THEN set new.rid = (select IFNULL(max(rid), 0) + 1 from evaluation_reports where evaluations_id = new.evaluations_id);
ELSE SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'failed to obtain lock; not continuing';
END IF;
Do RELEASE_LOCK(lockstring) ;
END