具有多个插入的Java事务不回滚

时间:2017-10-07 15:32:29

标签: java prepared-statement

我正在尝试将数据插入到Java中的多个表中。如果插入在1个表中失败,它应该回滚所有表中的数据。但由于某种原因,数据插入2个表而不插入其中1个表。它不应该插入到其他2中,因为其中一个表上的插入失败了。这就是我的代码:

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相同的模式。

我在哪里出错?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

根据java.sql.Statement.executeBatch()

的javadoc
  

如果批量更新中的某个命令无法正确执行,   此方法抛出BatchUpdateException,JDBC驱动程序可能或   可能无法继续处理批处理中的其余命令。

看起来你的驱动程序会在爆炸后继续处理剩余的命令,为了实现这一点,它必须打开一个新的事务来执行剩余的语句。