普通网友 2010-03-15 15:17
浏览 924
已采纳

Spring中JdbcTemplate执行SQL出错不回滚?

在Spring中为了方便用户对数据库的操作,Spring提供了JdbcTemplate以及HibernateTemplate。今天,查看这两个类源码,发现一问题,令我费解,请知道的朋友指点一下。
大致问题就是,在JdbcTemplate的execute(..)方法中,执行SQL抛出异常时,居然没出现回滚代码,具体代码我贴出来,方便大家参考,至于疑问,我也在代码中以注释的形式标出来了,请大家帮忙解释一下,谢谢!

[code="java"]public Object execute(StatementCallback action) throws DataAccessException {
Assert.notNull(action, "Callback object must not be null");

    Connection con = DataSourceUtils.getConnection(getDataSource());
    Statement stmt = null;
    try {
        Connection conToUse = con;
        if (this.nativeJdbcExtractor != null &&
                this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
            conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
        }
        stmt = conToUse.createStatement();
        applyStatementSettings(stmt);
        Statement stmtToUse = stmt;
        if (this.nativeJdbcExtractor != null) {
            stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
        }
        Object result = action.doInStatement(stmtToUse);  //执行SQL语句
        SQLWarning warning = stmt.getWarnings();
        throwExceptionOnWarningIfNotIgnoringWarnings(warning);
        return result;
    }
    catch (SQLException ex) { 
        /*
         * 加入执行SQL时抛出异常,一般来说应该回滚的,但是现在没有出现con.rollback()
         */
        // Release Connection early, to avoid potential connection pool deadlock
        // in the case when the exception translator hasn't been initialized yet.
        JdbcUtils.closeStatement(stmt);
        stmt = null;
        DataSourceUtils.releaseConnection(con, getDataSource());
        con = null;
        throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
    }
    finally {
        JdbcUtils.closeStatement(stmt);
        DataSourceUtils.releaseConnection(con, getDataSource());
    }
}[/code]

谢谢大家耐心观看以及分析!

  • 写回答

4条回答 默认 最新

  • lg321 2010-03-15 15:46
    关注

    具体代码我还没看过,不过我觉得应该注意
    Connection con = DataSourceUtils.getConnection(getDataSource());

    con应该是在一个线程中保存的。注意到了吗,con也没有commit。
    在一个事务开始的时候,con打开,并在操作后保存到线程中。当整个事务完成或失败时,才进行commit或callback。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog