[英]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.