Mysql在执行更新查询时默认使用独占锁吗?

Mysql在执行更新查询时默认使用独占锁吗?,mysql,innodb,database-locking,Mysql,Innodb,Database Locking,环境:Mysql5.7 InnoDB 联系 start transaction; --> <1> SELECT * FROM table_a WHERE id = 1 lock in share mode; --> <2> UPDATE table_a SET name = 'blah' WHERE id = 1; --> <3> 启动事务;--> 从表a中选择*,其中id=1,在共享模式下锁定;--> B连接 start trans

环境:Mysql5.7 InnoDB

联系

start transaction; --> <1>

SELECT * FROM table_a WHERE id = 1 lock in share mode; --> <2>
UPDATE table_a SET name = 'blah' WHERE id = 1; --> <3>
启动事务;-->
从表a中选择*,其中id=1,在共享模式下锁定;-->
B连接

start transaction; --> <1>

SELECT * FROM table_a WHERE id = 1 lock in share mode; --> <2>
UPDATE table_a SET name = 'blah' WHERE id = 1; --> <3>
updatetable\u集合名称='blah',其中id=1;-->
功能流程:->->

结论:查询结果为
blahblah
。但是,B Query()会等待

查询不是锁

为什么我会得到这个结果?
Mysql在执行更新查询时默认使用排他锁吗?

更新查询需要在其检查的行上持有排他锁,因此它将等待这些行上没有其他锁

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


如果使用事务隔离级别SERIALIZABLE,则所有SELECT语句都隐式地在共享模式下具有锁,因此它们将阻止更新。但这不是默认配置,因此您必须故意请求它。

为什么会得到什么结果?这里没有结果。你是如何得出你的“结论”的?我犯了一个错误。查询处于共享模式。我知道在共享锁模式下,独占锁不具有访问权限。但是,为什么B查询(简单更新查询)在使用共享锁时等待?因为独占锁意味着不可能存在其他锁。更新必须等待,直到它是唯一一个在它检查的行上持有任何类型锁的更新。对不起,你的答案是指UPDATE=Exclusive lock吗?我明白为什么我的答案的第一句话是含糊不清的。我对它进行了编辑,希望能更清楚。