繁体   English   中英

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

is setautocommit(true) needed after conn.commit()

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

假设该连接上的autocommit为 TRUE。

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

然后经过几次语句更新,最后conn.commit()/conn.rollback()完成了。

现在我是否需要执行明确的代码setautocommit(true)以恢复到以前的 conn 状态?

或者commit()\\rollback()会设置setautocommit(true)吗?

3 个回复

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

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

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();
    }
}

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

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

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

6 尽管有 conn.commit() 数据没有被添加到数据库

第一次在这里发帖,所以我为糟糕的格式道歉。 我最近开始使用 SQLite3 并查看了教程/说明,但我似乎无法使其正常工作,特别是添加数据不会将其提交到数据库。 我省略了一些代码,但本质上 card_number 只是一个字符串。 当我执行 或者 我分别得到一个空列表或没有。 我还尝试了不 ...

10 setAutocommit(true)进一步解释

我遇到过这个 oracle java教程。 作为主题的初学者,我无法理解为什么需要设置con.setAutocommit(true); 在交易结束时。 这是oracle的解释: 声明con.setAutoCommit(true); 启用自动提交模式,这意味着每个语句在完成后 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM