programing

MariaDB: 저장 프로시저 잠금 행에서 SELECT

powerit 2023. 10. 20. 14:50
반응형

MariaDB: 저장 프로시저 잠금 행에서 SELECT

저장 프로시저 SELECT에 문제가 있습니다.

분리 수준은 READ-COMMITED이고 엔진은 InnoDB이므로 모든 선택 항목은 잠금 일관성이 없는 읽기여야 합니다. https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html

데이터베이스는 MariaDB 버전 10.1입니다.

MariaDB [(none)]> select @@version;
+-----------------+
| @@version       |
+-----------------+
| 10.1.24-MariaDB |
+-----------------+
1 row in set (0.02 sec)

저장 프로시저 잠금을 선택한 후 테이블에서 잠금을 획득합니다.agent:

IF 
    v_pack_agent_id IS NULL OR 
    v_pack_agent_id not in                  
    (
        select ID from agent where LINKED_AGENTS_GUID = (select LINKED_AGENTS_GUID from agent where ID = a_agent_id) union all 
        select a_agent_id
    )
THEN
    SET a_sign = SIGN_NOT_OWN_BLOCK;
    LEAVE l_proc;
END IF;

테이블agent정의:

MariaDB [db_mercury]> show create table agent\G
*************************** 1. row ***************************
Table: agent
Create Table: CREATE TABLE `agent` (
`ID` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 'PK',
 ...
`LINKED_AGENTS_GUID` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
 PRIMARY KEY (`ID`),
 UNIQUE KEY `UK$ORA_ID` (`ORA_ID`),
 KEY `IDX_LINKED_AGENTS_GUID` (`LINKED_AGENTS_GUID`)
 ) ENGINE=InnoDB AUTO_INCREMENT=6198 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

문제는 nested in을 선택하기 때문입니다.IF블록, 이동할 경우 외부를 선택합니다.IF아래와 같이 잠금 장치가 확보되지 않습니다.

아무것도 잠기지 않습니다.

select ID 
from agent 
where LINKED_AGENTS_GUID = (select LINKED_AGENTS_GUID 
                            from agent 
                            where ID = a_agent_id) 
union all 
select a_agent_id

제가 보기엔 그것은 벌레 같습니다.

선택이 잠기는 이유가 무엇입니까?

MariaDB에 버그를 보고했더니 확인이 되더군요. https://jira.mariadb.org/browse/MDEV-18044

언급URL : https://stackoverflow.com/questions/53871298/mariadb-select-in-stored-procedure-locks-rows

반응형