gpt4 book ai didi

java - JDBC 事务错误处理

转载 作者:行者123 更新时间:2023-11-30 08:45:13 24 4
gpt4 key购买 nike

documentation about using transactions with jdbc建议使用以下代码

public void updateCoffeeSales(HashMap<String, Integer> salesForWeek)
throws SQLException {

PreparedStatement updateSales = null;
PreparedStatement updateTotal = null;

String updateString =
"update " + dbName + ".COFFEES " +
"set SALES = ? where COF_NAME = ?";

String updateStatement =
"update " + dbName + ".COFFEES " +
"set TOTAL = TOTAL + ? " +
"where COF_NAME = ?";

try {
con.setAutoCommit(false);
updateSales = con.prepareStatement(updateString);
updateTotal = con.prepareStatement(updateStatement);

for (Map.Entry<String, Integer> e : salesForWeek.entrySet()) {
updateSales.setInt(1, e.getValue().intValue());
updateSales.setString(2, e.getKey());
updateSales.executeUpdate();
updateTotal.setInt(1, e.getValue().intValue());
updateTotal.setString(2, e.getKey());
updateTotal.executeUpdate();
con.commit();
}
} catch (SQLException e ) {
JDBCTutorialUtilities.printSQLException(e);
if (con != null) {
try {
System.err.print("Transaction is being rolled back");
con.rollback();
} catch(SQLException excep) {
JDBCTutorialUtilities.printSQLException(excep);
}
}
} finally {
if (updateSales != null) {
updateSales.close();
}
if (updateTotal != null) {
updateTotal.close();
}
con.setAutoCommit(true);
}
}

但是,错误处理对我来说似乎是错误的?

如果try block 内部有NullPointerException,则不会被捕获。相反,执行将直接进入 finally block ,它将调用 con.setAutoCommit(true)according the documentation将提交任何正在进行的事务。看起来这显然不是预期的行为,因为它提交了一个不完整的事务。

我认为这可能只是示例中的一个错误,但是 other tutorials除了 SqlException ( further example ) 之外,还忘记捕获异常。

我是不是误解了什么?

最佳答案

在调用 con.setAutoCommit(true) 之前,该示例关闭了可能未完成的准备语句。因此,当切换回自动提交模式时,这些语句将不会被执行。那里不会提交未完成的事务。

我检查了你链接的第一个教程,它犯了一个错误,没有使用 finally block ,没有取消未完成的语句,也没有恢复自动提交模式。这看起来真的很粗心。

一般来说,我建议坚持使用官方教程,或者您真正信任的来源。

关于java - JDBC 事务错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33402531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com