如何在Spring + JDBC中配置关闭自动提交?

时间:2012-03-10 19:07:29

标签: java spring jdbc spring-jdbc

我使用Spring和JDBC,发现它是自动提交。

如何配置在spring-servlet.xml中将其关闭?

这是我目前的配置:

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
    p:driverClassName="${jdbc.driverClassName}"
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
    p:password="${jdbc.password}" />

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

3 个答案:

答案 0 :(得分:14)

似乎我的配置错过了这一行:

<tx:annotation-driven transaction-manager="txManager"/>

然后,在我的服务类中,我使用@Transactional注释。例如

@Service
class CompanyServiceImpl implements CompanyService{
    @Autowired
    private CompanyDAO companyDAO;

    @Transactional
    public void addCompany(Company company) {
            companyDAO.addCompany(company); // in here, there is JDBC sql insert
            companyDAO.addCompany_fail(company); // just for test
    }
}

如果addCompany_fail()中发生异常,则第一个addCompany()也将被回滚。

我按照这个文档来理解Spring中如何控制事务。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

我按照本文档了解如何在Spring中使用JDBC进行编码。 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

我也读过这个(免费)http://www.infoq.com/news/2009/04/java-transaction-models-strategy。这真的很棒。对于大多数人不了解(或关心)交易的作者,我也有同感。

PS: 似乎很多人误解使用这样的Hibernate / Spring框架只是为了避免JDBC和事务控制的复杂性。许多人认为“JDBC和Transaction是如此复杂,只需使用Hibernate而忘记这两者”。关于Spring + Hibernate或Spring + JDBC的互联网上的许多例子似乎根本不关心事务。我觉得这是一个糟糕的笑话。交易太严重了,只是让某些事情处理它而没有真正理解。

Hibernate和Spring是如此强大和复杂。然后,正如有人所说,“强大的力量伴随着责任”。

更新时间:2013-08-17:这里有关于交易的好例子http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial。但是,这并没有解释如果你想使用REQUIRES_NEW,为什么你需要创建另一个类(否则你会遇到这个问题Spring Transaction propagation REQUIRED, REQUIRES_NEW,看起来REQUIRES_NEW并没有真正创建一个新的事务)

更新:2018-01-01:我在这里使用Spring Boot 1.5.8.RELEASE创建了一个完整的示例https://www.surasint.com/spring-boot-database-transaction-jdbi/ 以及https://www.surasint.com/spring-boot-connection-transaction/

中的一些基本实验示例

答案 1 :(得分:6)

尝试defaultAutoCommit属性。代码看起来像这样:

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:defaultAutoCommit="false" />

看看javadoc: http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/BasicDataSource.html#defaultAutoCommit

答案 2 :(得分:2)

你不能,只是在一个事务中运行你的代码,Spring会自动禁用自动提交。在Spring中的事务中运行一段代码的最简单(至少是设置)方式是使用TransactionTemplate

TransactionTemplate template = new TransactionTemplate(txManager);

template.execute(new TransactionCallback<Object>() {
  public Object doInTransaction(TransactionStatus transactionStatus) {
    //ALL YOUR CODE ARE BELONG TO... SINGLE TRANSACTION
  }
}