MySQL 锁定方案
MySQL Locking scenarios
我们有大约 1 亿条记录和 100 多个字段的大型 table,并且有频繁的 select 和与此 table 相关的更新查询 运行。
现在我们有将近 50+ 个字段设置为 null 的需求,我们计划根据主键进行此更新。
我们知道当两个更新试图更新同一条记录时会有一个锁定机制。
我们的问题是,当更新和 select 查询试图访问同一条记录时会发生什么。
例如在我们的例子中
case1:如果我们在一个线程中 selecting 大约 10000 条记录,并且在此 select 查询执行期间,如果我们试图在另一个线程中将这 10000 条记录中的一条更新为 null,Will这两个查询都在不等待其他查询的情况下执行?在这种情况下,锁定机制将如何表现?
case2:如果我们将 10000 条记录更新为空,并且在此更新查询执行期间,如果我们尝试 select 这 10000 条记录中的一条,这两个查询是否会在不等待另一个查询的情况下执行?在这种情况下,锁定机制将如何表现?
我们正在使用 MySQL 5.7,InnoDB 引擎并考虑 MySQL 中的所有参数都是默认值
为这个基本问题道歉
鉴于您使用 InnoDB 作为存储引擎和默认配置选项的前提:
读者不会阻止作者,反之亦然,句号。
SELECT
查询(除非它是 locking read)可以读取行,即使它们被并发事务锁定。查询的结果将基于在 SELECT 查询的事务快照开始时提交的行的最新版本。
同样,UPDATE
可以锁定行,即使它正在被并发事务读取。
我们有大约 1 亿条记录和 100 多个字段的大型 table,并且有频繁的 select 和与此 table 相关的更新查询 运行。 现在我们有将近 50+ 个字段设置为 null 的需求,我们计划根据主键进行此更新。 我们知道当两个更新试图更新同一条记录时会有一个锁定机制。
我们的问题是,当更新和 select 查询试图访问同一条记录时会发生什么。 例如在我们的例子中
case1:如果我们在一个线程中 selecting 大约 10000 条记录,并且在此 select 查询执行期间,如果我们试图在另一个线程中将这 10000 条记录中的一条更新为 null,Will这两个查询都在不等待其他查询的情况下执行?在这种情况下,锁定机制将如何表现?
case2:如果我们将 10000 条记录更新为空,并且在此更新查询执行期间,如果我们尝试 select 这 10000 条记录中的一条,这两个查询是否会在不等待另一个查询的情况下执行?在这种情况下,锁定机制将如何表现?
我们正在使用 MySQL 5.7,InnoDB 引擎并考虑 MySQL 中的所有参数都是默认值
为这个基本问题道歉
鉴于您使用 InnoDB 作为存储引擎和默认配置选项的前提:
读者不会阻止作者,反之亦然,句号。
SELECT
查询(除非它是 locking read)可以读取行,即使它们被并发事务锁定。查询的结果将基于在 SELECT 查询的事务快照开始时提交的行的最新版本。
同样,UPDATE
可以锁定行,即使它正在被并发事务读取。