我试图了解数据库锁定,并且遇到了一件奇怪的事情。
我正在运行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 :-)