【问题标题】:Too many concurrently fired triggers (increase MaxNoOfFiredTriggers) from NDBCLUSTER来自 NDBCLUSTER 的并发触发的触发器太多(增加 MaxNoOfFiredTriggers)
【发布时间】:2016-07-05 10:29:40
【问题描述】:

我正在使用 MySQL Cluster NDB 进行批处理操作:在单个事务中插入 10000 或 5000 行并删除。插入工作正常,但删除失败并出现异常:

java.sql.SQLException: Got temporary error 221 'Too many concurrently fired triggers (increase MaxNoOfFiredTriggers)' from NDBCLUSTER
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1086) ~[mysql-connector-java-5.1.29-bin.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237) ~[mysql-connector-java-5.1.29-bin.jar:na]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169) ~[mysql-connector-java-5.1.29-bin.jar:na]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617) ~[mysql-connector-java-5.1.29-bin.jar:na]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) ~[mysql-connector-java-5.1.29-bin.jar:na]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2828) ~[mysql-connector-java-5.1.29-bin.jar:na]
at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1748) ~[mysql-connector-java-5.1.29-bin.jar:na]
at com.mchange.v2.c3p0.impl.NewProxyConnection.commit(NewProxyConnection.java:981) ~[c3p0-0.9.5.1.jar:0.9.5.1]
at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:112) [hibernate-core-4.1.0.Final.jar:4.1.0.Final]
at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:178) [hibernate-core-4.1.0.Final.jar:4.1.0.Final]

尝试增加 MaxNoOfFiredTriggers 并没有导致行为发生任何变化。

当然,我可以将事务拆分成更小的批次,但 5000 行对于一个数字来说听起来并不那么大,尤其奇怪的是插入实际上工作正常。

【问题讨论】:

    标签: mysql transactions database-trigger mysql-cluster


    【解决方案1】:

    我认为您在设置 MaxNoOfFiredTriggers 时没有考虑触发以强制执行外键约束的触发器。

    由于插入正常而删除不正常,我的猜测是您正在执行 DML 的表的至少一列被另一列(来自相同或不同的表)作为 FK 的一部分引用关系。

    例如考虑以下表格,

    create table parent(id int, unique uk1(id) using hash) engine ndb;

    create table child(id_ref int, foreign key fk1(id_ref) references parent(id)) engine ndb;

    现在,当您插入父表时,将在后端触发触发器以更新唯一索引 uk1。但是这里不需要 FK 触发器,因为没有什么要检查的。

    但是当您从父表中删除时,必须强制执行 FK 约束。如果子表没有从父表中删除的值,则应允许删除。如果 FK 约束有 on update cascade 子句,这可能会有所不同 - 在这种情况下,从父级删除的具有相同值的元组也必须在子级中删除。

    所有这些都是通过 FK 触发器强制执行的。因此,在从父级删除期间,除了触发更新哈希索引的触发器外,还将触发外键触发器。在这种情况下,每行都会触发两个触发器。因此,如果您在此设置中批量删除 5000 行,则至少需要 10K maxNoOfFiredTriggers 余量。使用多个外键并具有多个级别的外键依赖关系,此计算会有所不同。因此,您必须检查架构中的所有外键依赖项并相应地计算 MaxNoOfFiredTriggers

    【讨论】:

    • 老实说,我已经不记得 MaxNoOfFiredTriggers 的值是什么了,我也没有在问题中提到这一点......
    猜你喜欢
    • 2018-05-31
    • 2018-08-09
    • 2013-04-29
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2019-09-09
    相关资源
    最近更新 更多