【问题标题】:Java Jdbc TransactionJava Jdbc 事务
【发布时间】:2015-05-13 13:11:47
【问题描述】:

我需要在 jdbc 中执行一系列的选择、更新、插入查询。

这是我的代码:

 public String editRequest(){
connection = DatabaseUtil.getServiceConnection();
            try {
                connection.setAutoCommit(false);
                executeUpdateCategory(category, ticketid);
                executeUpdateSubCategory(subcategory,
                        ticketid);
                executeUpdateItem(item, ticketid));
                executeUpdateImpact(impact),ticketid));
                  connection.commit();
                 response = "Success";
            } catch (SQLException e) {
                rollback();
            }
    return response;
    }

方法定义:

    public void executeCategory(category,ticketid){
        try{
        //select query using connection and prepared statement

        }
        catch(SQLException e){
        e.printstacktrace();
        }

etc... methods

注意:由于它是单个事务。因此,如果我们在方法中遇到任何异常,它正在执行一些语句。它正在调用commit() 方法。

但是这些方法是可重用的。谁能在editRequest方法catch块中捕获异常,以便在出现错误时回滚事务?

【问题讨论】:

  • 如果您希望使用连接管理事务,则必须使用相同的连接对象,这反过来意味着您必须将连接对象传递给事务中的每个方法。跨度>
  • 不要在executeCategory()中捕获异常,只声明抛出SQLException
  • @ramp 看起来connection 是会员,然后就可以了……
  • @Uwe,你是对的。我没有注意到它是一个实例变量。
  • 你用 [spring] 标记了这个方法,那么你为什么不使用它呢?使用JdbcTemplate 和正确配置的DatasourceTransactionManager 并创建您的方法@Transactional。这简化了您的代码、获取日志记录和自动事务行为...

标签: java spring jakarta-ee jdbc


【解决方案1】:

简单的答案:重新抛出异常。

例子:

public void executeCategory(category, ticketid) throws SQLException {
    try {
        //select query using connection and prepared statement
    }
    catch(SQLException e){
        e.printStackTrace();
        throw e;
    }
}

这样你就可以在异常发生的地方记录异常,然后再次抛出到rollback()

另一种选择也许更好)是创建一个自定义异常并在此自定义异常上回滚:

public void executeCategory(category, ticketid) throws CustomException {
    try {
        //select query using connection and prepared statement
    }
    catch(SQLException e){
        e.printStackTrace();
        throw new CustomException(e);
    }
}

在您的调用代码中:

public String editRequest() {
connection = DatabaseUtil.getServiceConnection();
    try {
        connection.setAutoCommit(false);
        executeUpdateCategory(category, ticketid);
        // Further calls
        connection.commit();
        response = "Success";
    } catch (CustomException e) {
        rollback();
    }
    return response;
}

【讨论】:

  • 包装并重新抛出(第二个示例)会比重新抛出(第一个示例)刚刚捕获的异常更好。您将通过这种方式获得更多信息。
  • @rededge 感谢您的评论。更改了答案以明确这是更好的变体。第一个变体只是对所提问题的回答。
【解决方案2】:

如果您想在 editRequest 中捕获 SQLException,您需要通过向每个方法添加 throws 子句并删除 try catch 块来让它传播。

或者,您可以捕获异常并将其包装在另一个异常中,该异常在 editRequest 中抛出并捕获

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 2021-01-20
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多