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

2022-09-04 08:05:46

我正在将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>

答案 1

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

<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() 也会被回滚。

我按照本文档了解了春季交易的控制方式。http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

我按照本文档了解了如何在春季使用 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和Transacting太复杂了,只要使用Hibernate就忘了这两个”。互联网上许多关于Spring+Hibernate或Spring+JDBC的例子似乎根本不关心交易。我觉得这是一个糟糕的笑话。交易太严重了,不能只是让某事处理它而没有真正理解。

冬眠和春天是如此强大,如此复杂。然后,正如有人所说,“巨大的力量伴随着责任”。

更新日期: 2013-08-17:这里有关于交易的很好的例子,http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial。然而,这并不能说明如果你想使用REQUIRES_NEW,为什么你需要创建另一个类(否则你会得到这个问题 Spring事务传播必需,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/


答案 2

尝试默认自动提交属性。代码将如下所示:

<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


推荐