我正在使用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行对于一个数字来说听起来并不大,特别奇怪的是插入实际上工作正常。
答案 0 :(得分: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
。