是在conn.commit()之后需要的setautocommit(true)



从池中获取数据库连接(conn)。

假设autocommit在该连接上为TRUE。

现在conn.setautocommit(false)已经设置;

然后在几次语句更新之后,最后CCD_ 4已经完成。

现在,我是否需要显式地对setautocommit(true)进行编码以恢复到以前的conn状态?

或者commit()rollback()将固有地设置setautocommit(true)

这取决于您从哪里获得连接。如果您自己创建了连接,则无需恢复自动提交的状态。

如果是从数据源获取的,则应将状态恢复到原来的状态,因为数据源可能会将连接保留在池中,而下一段代码可能不会期望您设置的状态。

commit()不影响自动提交的值。启用自动提交只会确保JDBC驱动程序在您执行的每条语句之后调用commit()。你仍然可以随心所欲地调用commit(),它不会有任何效果(除了rollback()不会总是做你想做的事)。

[EDIT]如何处理自动提交取决于您的连接池。dbcp有一个配置选项,可以在为您提供连接之前关闭自动提交,c3p0将在您返回池时回滚连接。阅读连接池的文档,了解其工作原理。

如果您不知道使用的是哪个池,安全的解决方案是在获得连接时将自动提交设置为false,并在获得异常时回滚连接。我建议写一个包装:

public <T> T withTransaction( TxCallback<T> closure ) throws Exception {
    Connection conn = getConnection();
    try {
        boolean autoCommit = conn.getAutoCommit();
        conn.setAutoCommit(false);
        T result = closure.call(conn); // Business code
        conn.commit();
        conn.setAutoCommit(autoCommit);
    } catch( Exception e ) {
        conn.rollback();
    } finally {
        conn.close();
    }
}

此代码将为您正确处理连接,您不需要在业务代码中再担心它了。

有趣的是,conn.setAutoCommit(true);意味着commit(如果它处于autoCommit(false)模式,请参阅此处,但如果你仍然打破它们,人们可能会更清楚。

在Oracle 12c中,连接将默认为autocommit true。但是,如果将自动提交设置为false,则需要在释放到连接池之前将自动提交重置为true。conn.setAutoCommit(自动提交);应移动到最终块

最新更新