2016-07-05 3 views
0

MySQL Cluster NDB를 사용하여 일괄 처리 작업을하고 있습니다 : 단일 트랜잭션으로 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을 수행하는 테이블의 적어도 하나의 열이 다른 열 (같은 테이블 또는 다른 테이블)에 의해 참조되고 있다는 것입니다. 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