具有多个插入且不回滚的Java事务
我试图在Java中将数据插入到多个表中。如果在1个表中插入失败,它应该回滚所有表中的数据。但由于某些原因,数据插入到两个表中,而不是插入到其中一个表中。它不应该插入到其他2个表中,因为在其中一个表上插入失败。这就是我的代码的样子:具有多个插入且不回滚的Java事务,java,prepared-statement,Java,Prepared Statement,我试图在Java中将数据插入到多个表中。如果在1个表中插入失败,它应该回滚所有表中的数据。但由于某些原因,数据插入到两个表中,而不是插入到其中一个表中。它不应该插入到其他2个表中,因为在其中一个表上插入失败。这就是我的代码的样子: try { conn.setAutoCommit(false); dbConnector.insertA(myList1, conn); dbConnector.insertB(myList2, conn); dbConnec
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();
...
public void insertA(列表myList1,连接连接){
String myQuery=“插入表(colA、colB、colC)值(?,?);”;
PreparedStatement=conn.prepareStatement(myQuery);
对于(MyClass mc:myList1){
statement.setString(1,mc.getA());
statement.setString(2,mc.getB());
statement.setString(3,mc.getC());
语句addBatch();
}
语句。executeBatch();
语句。close();
康涅狄格州关闭();
...
}
注意:insertB
和insertC
方法遵循与insertA
相同的模式
我哪里出了问题?任何帮助都将不胜感激。根据
如果批处理更新中的某个命令无法正确执行,
此方法抛出一个BatchUpdateException,JDBC驱动程序可以或
不能继续处理批处理中的其余命令
您的驱动程序风格似乎在爆炸后继续处理剩余的命令,为了实现这一点,它必须打开一个新的事务来执行剩余的语句 根据
如果批处理更新中的某个命令无法正确执行,
此方法抛出一个BatchUpdateException,JDBC驱动程序可以或
不能继续处理批处理中的其余命令
您的驱动程序风格似乎在爆炸后继续处理剩余的命令,为了实现这一点,它必须打开一个新的事务来执行剩余的语句 您不应该在调用commit()或rollback()之前关闭连接,在这种情况下,某些数据库可能会隐式提交代码>内部
insertA
完全出乎意料。您不应该在调用commit()或rollback()之前关闭连接,在这种情况下,某些数据库可能会隐式提交。我想知道您的代码是否正确conn.close()代码>内部insertA
完全出乎意料。感谢您的回复。是的-这是我在桌子上遇到的例外,它不会插入。我正在尝试插入到DB2
。如果我不批量插入,所有操作都会成功进行。但是,一旦我添加代码以批量插入,它就会失败。谢谢您的回复。是的-这是我在桌子上遇到的例外,它不会插入。我正在尝试插入到DB2
。如果我不批量插入,所有操作都会成功进行。但是,一旦我添加了要批量插入的代码,它就会失败。