带事务锁的Mysql触发器

8dtrkrch  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(117)

我正在尝试添加一个触发器来更新journal_summary表中的自动凭证号。同时,为了防止重复,我尝试添加一个事务锁定。以下是我到目前为止的触发器。在没有事务锁定的情况下,它工作正常。当我添加锁时,它给出错误Transaction characteristics can not be changed while a transaction is in progress-在添加锁后,不能提交任何插入。
我还检查了是否有任何当前事务与此查询,但其结果为零。SHOW OPEN TABLES WHERE In_use > 0;
我做错了什么

DELIMITER $$
CREATE TRIGGER update_journal_no
BEFORE INSERT ON journal_summary
FOR EACH ROW
   BEGIN
        DECLARE v_count INT;
        DECLARE v_journal_no VARCHAR(15);
        SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- set the isolation level to serializable to use row-level locks
        SELECT COUNT(*) + 1 INTO v_count FROM journal_summary WHERE JournalDate = NEW.JournalDate AND concern_id = NEW.concern_id FOR UPDATE; -- use SELECT ... FOR UPDATE to lock the selected rows
         IF v_count > 99999 THEN -- exceeding 5 digits
         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot insert record: Too many journals for this date and concern.';
         END IF;
         SET v_journal_no = CONCAT(DATE_FORMAT(NEW.JournalDate, '%Y-%m-%d'), '-', LPAD(v_count, 5, '0'));
         UPDATE journal_summary SET journal_no = v_journal_no WHERE id = NEW.id; -- update the journal_no column with the calculated value
    END$$
DELIMITER ;
mwkjh3gx

mwkjh3gx1#

在这种情况下,错误消息是明确的:当您处于打开的事务中间并且触发器始终处于打开的事务中间时,您不能更改事务隔离级别。
由于可序列化隔离级别基本上将所有简单的select转换为select ...用于更新锁定读取,并且您已经使用了锁定读取,因此我认为您根本不需要更改事务隔离级别。

相关问题