为什么mysql事务锁只阻塞其他锁?

c0vxltue  于 2021-06-15  发布在  Mysql
关注(0)|答案(0)|浏览(160)

我试图理解数据库锁定,但遇到了一件奇怪的事情。
我正在运行MySQL5.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语句执行更新,也会发生同样的情况——在这种情况下,会出现“丢失的更新”,并且我认为在连接中创建的锁会阻止这种情况。
我是否必须将所有查询作为锁运行(用于更新),即使它们仅从表中选择数据。
向您致意:-)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题