【发布时间】:2019-05-16 22:27:42
【问题描述】:
我正在尝试使用 JDBC 事务添加名称及其薪水。 问题是这会引发关于重复键的异常。
这是我第一次在工资列中放入一些无效数据,之后一切都正确。它显示指定 id 的重复键异常 但指定 id 尚未存储,甚至第一次尝试时也没有存储。 第一个无效的事务被回滚,但在下次存储时显示重复键异常。
下面是我的代码:-
public boolean addDesignation(ObservableList nodeList) throws SQLException {
Connection demo = getConnection();
demo.setAutoCommit(false);
Savepoint savePoint = demo.setSavepoint("savePoint");
try {
PreparedStatement addDesig = demo.prepareStatement(
"INSERT INTO `designation`(`desig_id`,`dept_id`,`desig_name`,`desig_desc`) VALUES (?,?,?,?)");
PreparedStatement addSal = demo.prepareStatement("INSERT INTO `salary` "
+ "(`desig_id`, `basic`, `house_rent`, `conveyance`, `medical`, `dearness`,`others_allowances`,"
+ " `income_tax`, `pro_tax`, `emp_state_insu`, `absence_fine`, `others_deductions`, `month`)"
+ " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");
addDesig.setString(1 , nodeList.get(0).toString());
addDesig.setString(2, nodeList.get(1).toString());
addDesig.setString(3, nodeList.get(2).toString());
addDesig.setString(4, nodeList.get(3).toString());
addDesig.executeUpdate();
addSal.setString(1, nodeList.get(0).toString());
addSal.setInt(2, Integer.parseInt(nodeList.get(4).toString()));
addSal.setInt(3, Integer.parseInt(nodeList.get(5).toString()));
addSal.setInt(4, Integer.parseInt(nodeList.get(6).toString()));
addSal.setInt(5, Integer.parseInt(nodeList.get(7).toString()));
addSal.setInt(6,Integer.parseInt(nodeList.get(8).toString()));
addSal.setInt(7,Integer.parseInt(nodeList.get(9).toString()));
addSal.setInt(8, Integer.parseInt(nodeList.get(10).toString()));
addSal.setInt(9, Integer.parseInt(nodeList.get(11).toString()));
addSal.setInt(10, Integer.parseInt(nodeList.get(12).toString()));
addSal.setInt(11, Integer.parseInt(nodeList.get(13).toString()));
addSal.setInt(12, Integer.parseInt(nodeList.get(14).toString()));
addSal.setString(13, nodeList.get(15).toString());
addSal.executeUpdate();
demo.commit();
return true;
} catch (SQLException ex) {
demo.rollback(savePoint);
Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
}
return false;
}
【问题讨论】:
-
重复键异常意味着数据库中某个键的数据已经存在。鉴于您尚未发布minimal reproducible example,我们无法为您提供帮助,因为我们不知道您的表的定义及其约束,也不知道您尝试插入的数据或数据库中已经存在的数据,您也没有包含完整的异常堆栈跟踪。
-
另外,如果您使用 MySQL,请确保您的表是 InnoDB,MyISAM 不支持事务,因此回滚或提交对这些表类型没有任何作用。问题也可能是您只回滚到保存点,但尚未回滚或提交整个事务。保存点仅用于回滚事务的一部分:事务本身也需要提交或回滚。
-
我已经添加了表定义图像的链接,这些是 InnoDB。事务如何回滚??
-
使用
demo.rollback(),并删除您的保存点使用:它不会为您的代码添加任何内容。无论如何,不要发布图片,发布实际的DDL。