【问题标题】:Spring @Transactional and JDBC autoCommitSpring @Transactional 和 JDBC 自动提交
【发布时间】:2013-04-24 10:58:34
【问题描述】:

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

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

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

【问题讨论】:

  • 是的,确实如此。 Spring 通过注解实现类为你管理。
  • 谢谢,但你可以回答而不是评论:)
  • 不在乎。这里的每个人都是专家。当我给出答案时,有人告诉我应该是评论。我发表评论,你告诉我这应该是一个答案。谁在乎?有时我有时间回答,有时我没有。

标签: spring jdbc spring-batch


【解决方案1】:

PlatformTransactionManager 是一个接口,所以我不会说所有实现都设置了 AutoCommit = false,但是最常见的实现 (DataSourceTransactionManager) 确实设置了 AutoCommit = false。从 doBegin 方法看下面的代码 sn-p:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    相关资源
    最近更新 更多