您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用MySQL的FOR UPDATE锁定时,究竟锁定了什么?

使用MySQL的FOR UPDATE锁定时,究竟锁定了什么?

我们为什么不尝试一下呢?

CREATE DATABASE so1;
USE so1;
CREATE TABLE notification (`id` BIGINT(20), `date` DATE, `text` TEXT) ENGINE=InnoDB;
INSERT INTO notification(id, `date`, `text`) values (1, '2011-05-01', 'Notification 1');
INSERT INTO notification(id, `date`, `text`) values (2, '2011-05-02', 'Notification 2');
INSERT INTO notification(id, `date`, `text`) values (3, '2011-05-03', 'Notification 3');
INSERT INTO notification(id, `date`, `text`) values (4, '2011-05-04', 'Notification 4');
INSERT INTO notification(id, `date`, `text`) values (5, '2011-05-05', 'Notification 5');

现在,启动两个数据库连接

BEGIN;
SELECT * FROM notification WHERE `date` >= '2011-05-03' FOR UPDATE;

BEGIN;

如果MysqL锁定所有行,则以下语句将阻塞。如果仅锁定返回的行,则不应阻塞。

SELECT * FROM notification WHERE `date` = '2011-05-02' FOR UPDATE;

确实的确会阻止。

有趣的是,我们也无法添加将要读取的记录,即

INSERT INTO notification(id, `date`, `text`) values (6, '2011-05-06', 'Notification 6');

块呢!

我现在不能确定MysqL是否只是在锁定一定百分比的行时继续执行并锁定整个表,或者在确保SELECT ... FORUPDATE查询结果永远不会被其他事务更改的情况下真正明智的做法是(用INSERTUPDATEDELETE),而锁被保持。

MySQL 2022/1/1 18:30:28 有615人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶