簡體   English   中英

如何在Spring + JDBC中配置關閉自動提交?

[英]How can I config to turn off autocommit in 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>

似乎我的配置錯過了這一行:

<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傳播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/

嘗試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

你不能,只需在一個事務中運行你的代碼,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
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM