仅在不处于自动提交模式时回滚和提交

Posted

技术标签:

【中文标题】仅在不处于自动提交模式时回滚和提交【英文标题】:rollback and commit only when not in auto-commit mode 【发布时间】:2017-11-02 18:47:07 【问题描述】:

javadoc for Connection#rollback 明确指出:

只有在禁用自动提交模式时才应使用此方法。

commit 方法也存在类似的警告。

但是,查看代码,例如在Apache commons DbUtils 我只看到:

public static void rollback(Connection conn) throws SQLException 
        if (conn != null) 
            conn.rollback();
        

有一个实用功能只是为了防止 NPE 并省略测试自动提交模式似乎很奇怪。我会期待以下几点:

public static void rollback(Connection conn) throws SQLException 
    if (conn != null) 
        final boolean autoCommit = (boolean) conn.getAutoCommit();
        if (!autoCommit)
            DbUtils.rollback(conn);
    

javadoc 中的警告(rollback 仅应在禁用自动提交模式时调用)是否在实践中实际观察到,如果是这样,为什么成功的 JDBC 库不理会它?

【问题讨论】:

原因是,如果你没有禁用 autoCommit,你为什么还要在你的代码中调用 DbUtils.rollback(..)DbUtils.commit(..),如果你打电话给他们,那显然是一个错误,你应该注意。老实说,鉴于现代 try-with-resources,我发现很多 DbUtils 方法毫无用处。 【参考方案1】:

当启用自动提交时,回滚方法根本没有效果。

【讨论】:

以上是关于仅在不处于自动提交模式时回滚和提交的主要内容,如果未能解决你的问题,请参考以下文章

系统故障时自动恢复进程将使用事务日志前滚所有已提交的事务,并回滚任何未完成的事务。啥是前滚和回滚

sql 事务自动回滚

Git使用小技巧之回滚和撤销

openge sql 触发器的回滚和提交效果

什么是回滚操作

使用带有 autocommit=true 的 jdbc 时回滚批处理执行