conn.rollback() 上的错误未处理 SQLException...如何正确使用 commit()?
Posted
技术标签:
【中文标题】conn.rollback() 上的错误未处理 SQLException...如何正确使用 commit()?【英文标题】:Error Unhandled SQLException on conn.rollback()... How to correctly use commit()? 【发布时间】:2018-10-30 15:02:49 【问题描述】:所以,我正在努力学习。我为slopinnes道歉。此代码进行事务处理,因此自动提交必须为 false,但它在 conn.rollback() 上引发未处理的 SQLException,我不明白为什么如果它已经在 catch(exception) 中...我应该将所有内容都包装在另一个上吗尝试捕捉?
try
conn.setAutoCommit(false);
String sql="SELECT l.toy_id FROM LETTER l WHERE toy_id=?";
PreparedStatement selectStatement = conn.prepareStatement(sql);
String sqlD="DELETE FROM TOY WHERE toy_id=?";
PreparedStatement deleteStatement = conn.prepareStatement(sqlD);
String sqlU="INSERT INTO TOY (toy_id, toy_name, price,toy_type, manufacturer) VALUES (?,?,?,?,?)";
PreparedStatement UpdateStatement = conn.prepareStatement(sqlU);
// TODO Update or delete Toy for every row in file
for (List<String> row : fileContents) //!!!!!!!no borrar!!!
int toy_id=getToyId(row);
//should another try go here??
selectStatement.setInt(1, toy_id);
ResultSet rs = selectStatement.executeQuery(sql);
if (!rs.first()) //HERE WE DELETE
deleteStatement.setInt(1, toy_id);
deleteStatement.executeUpdate();
else
while (rs.next()) //HERE WE UPDATE
UpdateStatement.setInt(1, toy_id);
UpdateStatement.executeUpdate();
rs.close();
conn.commit();
catch (SQLException e)
System.out.println("ERRRROOOOOOORRRRR");
conn.rollback();
【问题讨论】:
" 我应该把所有东西都包装在另一个 try-catch 上吗?" - 可能,是的。它给您带来问题的原因是该语句是在try-catch
块的上下文之外执行的(是的,您在“catch”块内,但这不是一回事)
附带说明,为什么不使用数据库存储过程来执行选择、插入、更新和删除操作,并通过传递必要的参数从 Java 调用存储过程?
【参考方案1】:
第一次尝试应该引用连接(conn.setAutoCommit(false);...),内部尝试应该引用事务语句。见Transaction rollback on SQLException using new try-with-resources block
【讨论】:
【参考方案2】:在您的 finaly 块中添加以下代码:
try
if (connection != null)
connection.rollback();
connection.setAutoCommit(true);
catch (SQLException e)
LOG.error(e.getMessage(), e);
注意:您可以再次将自动提交设置为true
【讨论】:
以上是关于conn.rollback() 上的错误未处理 SQLException...如何正确使用 commit()?的主要内容,如果未能解决你的问题,请参考以下文章