Spring @Transactional 和 JDBC 自动提交

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

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

【讨论】:

以上是关于Spring @Transactional 和 JDBC 自动提交的主要内容,如果未能解决你的问题,请参考以下文章

Spring @Transactional 和 Spring @Lock 注解有啥关系?

spring 和@transactional,这正常吗?

Spring @Transactional 合并和持久化问题

Spring @Transactional 和 @Async

Spring @Transactional 和 JDBC 自动提交

Spring @Transactional 使用