代码之家  ›  专栏  ›  技术社区  ›  Pustovalov Dmitry

MariaDB:在存储过程锁定行中选择

  •  1
  • Pustovalov Dmitry  · 技术社区  · 7 年前

    隔离级别为只读提交,引擎为InnoDB,因此所有select应为非锁定一致读取: 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;
    

    桌子 代理人 定义:

    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
    

    问题是因为选择嵌套在 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
    

    对我来说,这就像一只虫子。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Pustovalov Dmitry    7 年前

    我向MariaDB报告了一个bug,他们确认了: https://jira.mariadb.org/browse/MDEV-18044