为什么MySQL事务锁仅阻止其他锁?

时间:2018-12-19 12:14:06

标签: mysql locking

我试图了解数据库锁定,并且遇到了一件奇怪的事情。

我正在运行MySQL版本5.7.24。

在以下模式中:

CREATE TABLE IF NOT EXISTS `docs` (
  `id` int(6) unsigned NOT NULL,
  `content` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `docs` (`id`, `content`) VALUES
  ('1', 'The earth is flat'),
  ('2', 'One hundred angels can dance on the head of a pin'),
  ('3', 'The earth is flat and rests on a bull\'s horn'),
  ('4', 'The earth is like a ball.');

[示例1]:

连接A 中:

BEGIN;
select * from docs where id = 2 FOR UPDATE;

然后在连接B 中:

select * from docs where id = 2 FOR UPDATE;

连接B等待连接A中的事务被提交。 这就是我所期望的。

[示例2]:

连接A 中:

BEGIN;
select * from docs where id = 2 FOR UPDATE;

然后在连接B 中:

select * from docs where id = 2;

然后我立即在连接B中得到结果。 为什么不等待连接A中的事务提交?

如果我代替SELECT语句进行UPDATE时也会发生同样的情况-在这种情况下,将出现“丢失的更新”,并且我认为在连接A中创建的锁将阻止这种情况。

即使所有查询仅从表中选择数据,我是否也必须将所有查询都作为锁运行(FOR UPDATE)。

最好问候thephper :-)

0 个答案:

没有答案