2017-10-07 2 views
1

Java의 여러 테이블에 데이터를 삽입하려고합니다. 삽입이 1 개의 테이블에서 실패하면 모든 테이블의 데이터를 롤백해야합니다. 그러나 어떤 이유로 데이터가 2 개의 테이블에 삽입되고 그 중 하나에 삽입되지 않습니다. 테이블 중 하나에서 삽입이 실패 했으므로 다른 테이블에 삽입하지 않아야합니다. 삽입 방법여러 삽입이있는 Java 트랜잭션이 롤백되지 않습니다.

try { 
    conn.setAutoCommit(false); 

    dbConnector.insertA(myList1, conn); 
    dbConnector.insertB(myList2, conn); 
    dbConnector.insertC(myList3, conn); 

    conn.commit(); 
} catch(SQLException e) { 
    try { 
      conn.rollback(); 
      e.printStackTrace(); 

    } 
    ... 
} 

그리고 내부 : 이것은 내 코드는 모습입니다

public void insertA(List<MyClass> myList1, Connection conn){ 
    String myQuery = "INSERT INTO TABLE (colA, colB, colC) VALUES(?,?,?);"; 
    PreparedStatement statement = conn.prepareStatement(myQuery); 

    for (MyClass mc : myList1) { 
    statement.setString(1, mc.getA()); 
    statement.setString(2, mc.getB()); 
    statement.setString(3, mc.getC()); 
    statement.addBatch(); 
    } 
    statement.executeBatch(); 
    statement.close(); 
    conn.close(); 

    ... 

}

참고 : insertBinsertC 방법 insertA와 같은 패턴을 따른다.

어디서 잘못 되었나요? 어떤 도움이라도 대단히 감사하겠습니다.

+0

commit() 또는 rollback()을 호출하기 전에 연결을 닫지 않아야합니다. 일부 데이터베이스는이 경우 암시 적으로 커밋 될 수 있습니다. – user3714601

+0

코드가 맞다면'conn.close();'내부의'insertA'는 완전히 예상치 못한 것입니다. –

답변

0

javadoc가 당으로 배치 갱신의 명령 중 하나가 제대로 실행되지 않으면 java.sql.Statement.executeBatch()

를 들어, 이 방법은 않고 BatchUpdateException를 throw하고, JDBC 드라이버 또는 는 처리를 계속하지 않을 수도 있습니다 배치의 나머지 명령

폭발 후 나머지 명령을 계속 처리하고 나머지 명령문을 실행하는 새 트랜잭션을 열어야한다는 것을 알 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 예 - 그것이 삽입되지 않을 테이블에 올라가고있는 예외입니다. DB2에 삽입하려고합니다. 배치에 삽입하지 않으면 모든 것이 성공적으로 처리됩니다. 그러나 배치에 삽입 할 코드를 추가하면 실패합니다. – user2554121

관련 문제