mysql - MariaDB:存储过程中的 SELECT 锁定行

标签 mysql locking mariadb innodb

我在存储过程中遇到 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;

代理定义:

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 block 中,如果我将 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 被锁定有什么想法吗?

最佳答案

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

关于mysql - MariaDB:存储过程中的 SELECT 锁定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53871298/

相关文章:

javascript - 在插入到数据库之前验证表单控件

c# - 在 ASP.NET MVC 站点中使用 Lucene.Net 时出现目录锁定错误

c++ - 在 Linux 上锁定单个进程内数据访问的最快方法

mysql - MariaDB 如何维护数据库连接?

php - 无法从 WAMP 登录 MySQL,但可以登录 MariaDB

mysql - 构建 docker 容器后运行自定义 SQL 查询

php - 从数据库向多个地址发送电子邮件

mysql - 将日期从 MM/DD/YYYY 解析为 MYSQL 可以使用的格式

MySQL面试题行数和慢查询

c# - 如果我锁定一个对象而另一个线程使用该变量会怎样?