emilly Asked: 2019-05-19 09:20:06 +0800 CST2019-05-19 09:20:06 +0800 CST 2019-05-19 09:20:06 +0800 CST 这个用例中的语句执行顺序是什么? 772 假设我select * from users在 t1 执行,在 t3 完成。在 t2(在 t1 和 t3 之间),用户表中的一些记录会更新,比如 update users set address='xyz'名称 = 'abc'。select 语句会提前获取所有行的共享锁,还是在开始读取每一行时独立获取每一行? 我的理解是(在选择或更新中)谁先获取共享锁或独占锁,它将执行它,其他人会等待吗? 我正在使用 Mysql innodb 。 mysql innodb 1 个回答 Voted Best Answer Rick James 2019-05-19T16:46:59+08:002019-05-19T16:46:59+08:00 这取决于transaction_isolation. 这取决于是否SELECT包含FOR UPDATE或IN SHARE MODE. 在SELECT交易中。通常,他们SELECT会看到交易开始时的表格。其他查询可能会更新/插入/删除SELECT正在访问的行,但SELECT不会看到它们。这给 InnoDB 带来了负担,需要在这种情况下保留行的旧/新副本。 如果你说FOR UPDATE,另一个事务很可能会被延迟,等待“意向改变”锁被释放。 否则可能会导致僵局。InnoDB 善于观察情况是否不能通过等待来解决。 也许您想讨论一个具体案例?
这取决于
transaction_isolation
.这取决于是否
SELECT
包含FOR UPDATE
或IN SHARE MODE
.在
SELECT
交易中。通常,他们SELECT
会看到交易开始时的表格。其他查询可能会更新/插入/删除SELECT
正在访问的行,但SELECT
不会看到它们。这给 InnoDB 带来了负担,需要在这种情况下保留行的旧/新副本。如果你说
FOR UPDATE
,另一个事务很可能会被延迟,等待“意向改变”锁被释放。否则可能会导致僵局。InnoDB 善于观察情况是否不能通过等待来解决。
也许您想讨论一个具体案例?