隔离级别为只读提交,引擎为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
对我来说,这就像一只虫子。