2012-03-10 78 views
12

我使用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> 

回答

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創建了一個完整的示例。在這裏發佈https://www.surasint.com/spring-boot-database-transaction-jdbi/ 和這裏的一些基本實驗示例https://www.surasint.com/spring-boot-connection-transaction/

+0

而這個工作是因爲Spring事務管理器關閉了自動提交併做了自己的提交? – Raedwald 2013-12-20 15:27:02

2

您不能簡單地運行在一個事務中的代碼,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 
    } 
} 
+0

感謝您的回答。爲了支持更大的圖片,似乎Spring爲簡單的jdbc創建了更多的複雜性。 :) – 2012-03-10 20:31:20

+0

@SurasinTancharoen:好吧,不是真的。我說最簡單*設置*,但不能使用。使用'@Transactional'或AOP,您可以在單個事務中運行多行代碼,並對代碼進行最少的更改。 – 2012-03-10 21:37:52

+0

我剛剛閱讀了這個http://www.ibm.com/developerworks/java/library/j-ts2/index.html 可以用「與Spring編程事務」替代嗎? – 2012-03-11 11:04:42