MariaDB: SELECT в хранимой процедуре блокирует строки - PullRequest
0 голосов
/ 20 декабря 2018

У меня проблема с 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

Проблема в том, что select, вложенный в блок IF, если я переместил select за пределы 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

Для меняэто похоже на ошибку.

Есть идеи, почему select блокируется?

1 Ответ

0 голосов
/ 04 января 2019

Я сообщил об ошибке MariaDB, и они подтвердили: https://jira.mariadb.org/browse/MDEV-18044

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...