MySQL更新会影响查询吗

您所在的位置:网站首页 select会阻塞update MySQL更新会影响查询吗

MySQL更新会影响查询吗

2024-02-17 08:41| 来源: 网络整理| 查看: 265

**编辑**

从目标表中选择

Subqueries in the FROM clause can return a scalar, column, row, or table. Subqueries in the FROM clause cannot be correlated subqueries, unless used within the ON clause of a JOIN operation.

所以,是的,您可以执行上述查询.

问题

这里真的有两个问题.有并发性,或确保没有其他人从我们脚下改变数据.这是通过锁定来处理的.使用派生表处理新值与旧值的实际修改.

锁定

对于上面的查询,使用InnoDB,MySQL首先执行SELECT,并分别获取表中每一行的读(共享)锁.如果SELECT语句中有WHERE子句,那么只会锁定您选择的记录,其中范围也会导致任何间隙被锁定.

A read lock阻止任何其他查询获取写锁定,因此在读取锁定时无法从其他位置更新记录.

然后,MySQL分别获取表中每个记录的写(独占)锁.如果在UPDATE语句中有WHERE子句,那么只有特定记录会被写入锁定,而且如果WHERE子句选择了一个范围,那么你将锁定一个范围.

任何具有前一个SELECT读锁定的记录都会自动升级为写锁定.

write lock阻止其他查询获得读或写锁.

您可以使用Innotop通过在锁定模式下运行它来启动事务,执行查询(但不提交它),并且您将在Innotop中看到锁定.此外,您可以使用SHOW ENGINE INNODB STATUS查看没有Innotop的详细信息.

死锁

如果同时运行两个实例,则您的查询容易出现死锁.如果查询A得到了读锁,那么查询B得到了读锁,查询A必须等待查询B的读锁才能获得写锁.但是,查询B在完成之前不会释放读锁,除非它可以获取写锁,否则它不会完成.查询A和查询B陷入僵局,因此陷入僵局.

因此,您可能希望执行显式表锁,以避免大量的记录锁(使用内存并影响性能),并避免死锁.

另一种方法是在内部SELECT上使用SELECT … FOR UPDATE.这开始于所有行上的写锁定,而不是从读取和升级它们开始.

派生表

对于内部SELECT,MySQL创建一个derived temporary table.派生表是存在于由MySQL自动创建的临时表中的数据的实际非索引副本(与您显式创建并可以添加索引的临时表相对)至).

由于MySQL使用派生表,这是您在问题中引用的临时旧值.换句话说,这里没有魔力. MySQL就像你在其他地方做的那样,具有临时值.

您可以通过针对UPDATE语句执行EXPLAIN来查看派生表(MySQL 5.6中支持).



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3