0

我正在使用 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 行对于一个数字来说听起来并不那么大,尤其奇怪的是插入实际上工作正常。

4

1 回答 1

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相应计算。

于 2017-03-30T23:17:58.297 回答