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