当前位置: 首页 > 面试题库 >

如何提高INSERT INTO…SELECT锁定行为

云宜人
2023-03-14
问题内容

在生产数据库中,我们每小时运行以下伪代码SQL批查询:

INSERT INTO TemporaryTable
    (SELECT FROM HighlyContentiousTableInInnoDb
     WHERE allKindsOfComplexConditions are true)

现在,此查询本身并不需要很快,但是我注意到它已经被锁定HighlyContentiousTableInInnoDb,即使它只是从中读取。这使得其他一些非常简单的查询需要大约25秒(这是其他查询所花费的时间)。

然后我发现InnoDB表实际上是由SELECT锁定的!https://www.percona.com/blog/2006/07/12/insert-
into-select-performance-with-innodb-
tables/

但是我真的不喜欢选择OUTFILE的文章中的解决方案,它看起来像是一种黑客(文件系统上的临时文件似乎很烂)。还有其他想法吗?有没有一种方法可以在不复制InnoDB表的情况下将其锁定。然后,我可以将其复制HighlyContentiousTable到另一个表并在那里进行查询。


问题答案:

现在,此问题的答案要容易得多:-使用基于行的复制和读取提交隔离级别。

您遇到的锁定消失了。

更长的解释:http : //harrison-fisk.blogspot.com/2009/02/my-favorite-
new-feature-of-mysql-51.html



 类似资料:
  • 我从过去几个月开始使用spring,我有一个关于交易的问题。我在我的spring批处理作业中有一个java方法,它首先执行一个select操作以获取前100行,状态为“未完成”,并对所选行进行更新以将状态更改为“进行中”。由于我正在处理大约1000万条记录,我想运行批处理作业的多个实例,每个实例都有多个线程。对于单个实例,为了确保两个线程不会获取同一组记录,我将方法设置为同步。但是,如果我运行批处

  • 问题内容: 我有一张带桌子的桌子。 我需要访问并递增。 在访问期间,我需要锁定特定的用户行(而不是整个表)。 我该怎么做呢? 表格类型为。 问题答案: MySQL仅使用MyISAM表中的表级锁定。如果可以,请切换到InnoDB进行行级锁定。 这是指向MySQL网站的链接,该链接描述了由SQL语句为InnoDB表设置的锁。 http://dev.mysql.com/doc/refman/5.0/en

  • 我有下面的hql查询。我想选择而不锁定表部门,员工,以便其他查询并发从这些表中检索记录,即使以下查询正在运行/执行 我试过了,但还是有锁

  • 问题内容: 我有一个复杂的选择查询和一个巨大的表。 我正在运行此语句,同时有一条语句到达并尝试 更新 表。 恕我直言-更新需要 排他 锁-因此update语句将不得不 等待 select命令完成。 我对吗 ? 我该怎么才能做到:执行复杂的, 并且 也让命令运行( 目前我不在乎脏数据 ) 问题答案: 是的-在一定程度上。 多长时间,取决于事务的隔离级别上共享锁认为: -完全不获取共享锁-不被阻止 -

  • 我正在使用ApachePOI将数据写入Excel文件,我希望第一行为只读,其他行可以随时编辑。但我没有找到有效的解决方法。 下面是我的代码: 看起来这个java代码块应该可以工作,但实际上它不仅会锁定第一行,还会锁定其他行的空单元格。 所以我想知道,有没有一种有效的方法可以使用apachepoi只锁定excel文件的第一行?

  • 假设表 和 都有一行,则查询 应该有两个行级锁(一个在 A 上,一个在 B 上)。是否有任何定义的顺序来获取锁?有没有办法要求表 b 中的锁在来自 a 的锁之前获得锁定(以避免与其他事务死锁)?