17

在我的实际应用程序中,我有一个未设置 JDBC autoCommit=false 的 DBCP 连接池。它似乎有默认的 autoCommit=true。这可能是一个错误,但我想了解更改此参数的影响。

我正在使用: - 带有 @Transactional 注释的 Spring - 带有 JDBC 读取器和写入器的 Spring Batch,最终使用 JdbcTemplate 自定义小任务

我想知道 Spring 是否在当前连接上设置了 autoCommit=false,如果它是在 TransactionManager 处理的事务的上下文中。它会覆盖默认设置吗?因为在我看来这样做是有道理的。

4

1 回答 1

15

PlatformTransactionManager 是一个接口,所以我不会说所有实现都设置了 AutoCommit = false,但是最常见的实现 (DataSourceTransactionManager) 确实设置了 AutoCommit = false。请参阅 doBegin 方法的以下代码片段:

if (con.getAutoCommit()) {
            txObject.setMustRestoreAutoCommit(true);
            if (logger.isDebugEnabled()) {
                logger.debug("Switching JDBC Connection [" + con + "] to manual commit");
            }
            con.setAutoCommit(false);
        }
        txObject.getConnectionHolder().setTransactionActive(true);

现在正如您所说,这样做非常有意义,否则您将没有回滚段来激活回滚。

于 2013-04-30T14:28:33.667 回答