【问题标题】:SQL Inserts failing from one server and working from other server, due to locking由于锁定,SQL 插入从一台服务器失败并在另一台服务器上工作
【发布时间】:2018-08-25 14:58:01
【问题描述】:

我有两个表,每个表大约有 65-7000 万行,每个表大约 25 列。 几天前,我们在它上面运行了一个大更新查询,其中涉及到这两个表的连接。

类似这样的:

update A INNER JOIN B on a.some_fk=b.some_fk set A.field1=B.field1 where A.field1 is null;

这个查询占用了很大的锁,阻塞了很多查询,这里有一个有问题。

应用程序有两个服务器,都发送下面提到的相同查询

INSERT INTO A(X,Y,Z) VALUES(X,Y,Z)

但是这个查询一直给出 Lock wait timeout exceeded;尝试从其中一台机器重新启动事务,并在另一台机器上工作更多次。两台机器的成功配给比例为 1:100。

为什么会发生这种情况,为什么这是调用者的功能。 两台机器具有相同的配置、相同的连接数、相同的带宽等。

【问题讨论】:

    标签: mysql database join locking


    【解决方案1】:

    想到了一些事情,如果您已经想到了,请见谅:

    1. 与服务器 2 相比,服务器 1 上的表具有不同的行数/匹配值
    2. 表有不同的索引或索引在两台服务器上的碎片级别不同
    3. 两台服务器有不同的使用模式,这意味着你的锁在第二台服务器上有更多的竞争
    4. 这些表在每台服务器上具有不同的锁升级阈值,或者位于不同的页面大小或使用不同的缓存大小

    一般来说,我会说如果查询太大,您正在填写日志或导致性能问题,您应该将更新分块,例如一次循环更新 n 行(任何行数最有利于在不崩溃的情况下完成。)

    【讨论】:

      猜你喜欢
      • 2011-03-18
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多