如果通过 REST API 在 mysql 中获得的锁未重新释放会发生什么情况

问题描述 投票:0回答:1

我在 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 在没有一些非空值的情况下向表中插入一个条目,并且锁没有被释放,因为在执行触发器之前而不是在触发器之后。那么如何防止此类情况发生呢?

java mysql locking
1个回答
0
投票

应该尽快发布,是什么阻止你这样做?

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 
© www.soinside.com 2019 - 2024. All rights reserved.