0

MySQL Cluster NDB を使用してバッチ操作を行っています。1 回のトランザクションで 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 を実行しているテーブルの少なくとも 1 つの列が、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 トリガーによって適用されます。そのため、親からの削除中に、ハッシュ インデックスを更新するために起動されるトリガーに加えて、外部キー トリガーも起動されます。この場合、行ごとに 2 つのトリガーが起動されます。したがって、このセットアップで 5000 行をバッチで削除する場合、少なくとも 10K の maxNoOfFiredTriggers 許容値が必要になります。複数の外部キーがあり、複数レベルの外部キーの依存関係がある場合、この計算は異なります。したがって、すべての外部キーの依存関係についてスキーマを確認し、MaxNoOfFiredTriggersそれに応じて計算する必要があります。

于 2017-03-30T23:17:58.297 に答える