2016-07-05 72 views
0

我正在用MySQL Cluster NDB進行批量操作:在單個事務中插入10000行或5000行並刪除。插入工作正常,但去除失敗的異常:來自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] 

試圖增加MaxNoOfFiredTriggers沒有導致行爲的任何變化。

當然,我可以將交易分成更小的批次,但5000行聽起來並不是那麼龐大,尤其令人奇怪的是insert實際上工作正常。

回答

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

+0

老實說,我不記得什麼是MaxNoOfFiredTriggers的價值,我沒有提到這個問題... – divanov