0

环境:Mysql5.7 InnoDB

一个连接

start transaction; --> <1>

SELECT * FROM table_a WHERE id = 1 lock in share mode; --> <2>

B 连接

UPDATE table_a SET name = 'blah' WHERE id = 1; --> <3>

功能流程:<1> -> <2> -> <3>

结论:<2>查询结果是blahblah。但是,B Query(<3>) 等待。

B 查询没有锁。

为什么我会得到这个结果?Mysql在进行UPDATE查询时是否默认使用排他锁?

4

1 回答 1

1

UPDATE 查询需要在它检查的行上持有一个排他锁,所以它会一直等到这些行上没有其他锁。

SELECT 查询不会阻塞 UPDATE 查询,除非 SELECT 是带有 FOR UPDATE、FOR SHARE 或 LOCK IN SHARE MODE 子句的锁定查询。

如果使用事务隔离级别 SERIALIZABLE,则所有SELECT 语句都隐含地具有 LOCK IN SHARE MODE,因此它们将阻止 UPDATE。但这不是默认配置,因此您必须故意请求它。

于 2019-12-10T01:22:53.183 回答