2016-07-05 1 views
0

MySQL Cluster NDBでバッチ操作を行っています:1回のトランザクションで10000または5000個の行を挿入して削除します。挿入は正常に動作しますが、除去が例外で失敗します。動作のいずれかの変化をもたらさなかったMaxNoOfFiredTriggersを高めるためにNDBCLUSTERから同時にトリガーされたトリガが増えました(MaxNoOfFiredTriggersを増やします)

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] 

試みを。

確かに、トランザクションをより小さいバッチに分割することはできますが、5000行はその数字にとって巨大なものではなく、特に挿入が実際にうまく機能しているとは思えません。

答えて

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を計算する必要があります。

+0

正直言って、私はMaxNoOfFiredTriggersの価値が何であったかを覚えていません。私は質問でこれを言及しませんでした... – divanov

関連する問題