假设,我运行这个查询,它将整个表锁定在 InnoDB 中,直到它完成:
Update UserDetails set balance = 0
然后我运行这个查询:
Select * from User inner join UserDetails on (User.id = UserDetails.userid)
我们知道从锁定的表中进行选择是允许的。但是,即使在 UPDATE 运行时,InnoDB 是否会允许在锁定表上进行内部连接的 select并发运行?
假设,我运行这个查询,它将整个表锁定在 InnoDB 中,直到它完成:
Update UserDetails set balance = 0
然后我运行这个查询:
Select * from User inner join UserDetails on (User.id = UserDetails.userid)
我们知道从锁定的表中进行选择是允许的。但是,即使在 UPDATE 运行时,InnoDB 是否会允许在锁定表上进行内部连接的 select并发运行?
Update UserDetails set balance = 0
更新表中的每一行,因此它必须锁定表中的每一行。
设计一个需要进行如此大规模更新的模式很少是明智的。我强烈建议您重新考虑处理。如果您想进一步讨论这个问题,请提供更多关于逻辑的信息。
回到你的问题...
有(为了简化)两种类型的行锁——排他读和共享读。
“独家”表示“放手,我在这里很忙”。“共享阅读”是任意数量的观众观看。
但是,当您参与交易时,还有更多的故事。在某些情况下,您希望 aSELECT
阻止UPDATE
. 见FOR UPDATE
。
但是,即使在 UPDATE 运行时,InnoDB 是否会允许在锁定表上进行内部连接的 select 并发运行?
交易本身是SELECT
不是更大交易的一部分?
SELECT
是的,the和 the很有可能UPDATE
重叠。每个人都在查看数据的不同快照。(这进入了实现和“事务隔离模式”。)