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

Kan*_*mar 10 oracle jdbc

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

假设autocommit该连接为TRUE.

现在conn.setautocommit(false)已经定了;

经过几次声明更新后终于conn.commit()/conn.rollback()完成了.

现在我需要显式代码setautocommit(true)恢复到以前的conn状态吗?

commit()\rollback()setautocommit(true)固有的设定?

Aar*_*lla 10

这取决于你从哪里获得这种联系.如果您自己创建了连接,则无需还原自动提交的状态.

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

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

[编辑]如何处理自动提交取决于您的连接池.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码将为您正确处理连接,您无需再在业务代码中担心它.

  • @AaronDigulla连接池也可以(我相信大多数人)在逻辑连接关闭时提交,因为这也允许物理连接(_"如果调用`close`方法并且有一个活动事务,结果是实现定义的."_) (2认同)