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 和 @Async