2012-03-10 54 views
12

Tôi đang sử dụng Spring với JDBC và thấy rằng nó là autocommit.Tôi có thể cấu hình để tắt tự động trong Spring + JDBC như thế nào?

Tôi có thể định cấu hình để tắt nó trong spring-servlet.xml bằng cách nào?

Đây là cấu hình hiện tại của tôi:

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

Trả lời

14

Dường như cấu hình của tôi bỏ lỡ dòng này:

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

Sau đó, trong các lớp dịch vụ của tôi, tôi sử dụng @Transactional chú thích. Ví dụ:

@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 
    } 
} 

Nếu có ngoại lệ xảy ra trong addCompany_fail(), công cụ addCompany() đầu tiên cũng sẽ được khôi phục.

Tôi đã theo dõi tài liệu này để hiểu ý tưởng về cách giao dịch được kiểm soát trong Spring. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

Tôi đã làm theo tài liệu này để hiểu cách viết mã bằng JDBC vào mùa xuân. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

Tôi cũng đọc phần này (Miễn phí) http://www.infoq.com/news/2009/04/java-transaction-models-strategy. Nó thực sự tốt. Và tôi cảm thấy như vậy với nhà văn mà hầu hết mọi người không hiểu (hoặc quan tâm) về giao dịch.

PS: Dường như nhiều người hiểu lầm rằng việc sử dụng khung công tác Hibernate/Spring này chỉ để tránh sự phức tạp của JDBC và Kiểm soát giao dịch. Nhiều người nghĩ rằng "JDBC và Giao dịch rất phức tạp, chỉ cần sử dụng Hibernate và quên đi hai". Nhiều ví dụ trên internet về Spring + Hibernate hoặc Spring + JDBC dường như không quan tâm đến giao dịch. Tôi cảm thấy rằng đây là một trò đùa tồi tệ. Giao dịch quá nghiêm trọng vì chỉ để cho một cái gì đó xử lý nó mà không thực sự hiểu.

Hibernate và Spring rất mạnh mẽ và phức tạp đến vậy. Sau đó, như ai đó đã nói, "Quyền lực lớn đi kèm với trách nhiệm".

CẬP NHẬT: 2013-08-17: Có ví dụ điển hình về giao dịch tại đây http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial. Tuy nhiên, đây không phải giải thích rằng nếu bạn muốn sử dụng REQUIRES_NEW, tại sao bạn cần phải tạo ra một lớp khác (nếu không bạn sẽ nhận được vấn đề này Spring Transaction propagation REQUIRED, REQUIRES_NEW, mà có vẻ như REQUIRES_NEW không thực sự tạo ra một giao dịch mới)

Cập nhật: 2018 -01-01: Tôi đã tạo một ví dụ đầy đủ với Spring Boot 1.5.8.TIẾP CẬN tại đây https://www.surasint.com/spring-boot-database-transaction-jdbi/ và một số ví dụ thí nghiệm cơ bản tại đây https://www.surasint.com/spring-boot-connection-transaction/

+0

Và điều này làm việc vì trình quản lý giao dịch Spring tắt tự động cam kết và thực hiện các cam kết của riêng nó? – Raedwald

2

Bạn có thể không, chỉ cần chạy mã của bạn trong một giao dịch, mùa xuân sẽ tự động vô hiệu hóa tính năng tự động cam kết cho bạn. Cách dễ dàng nhất (ít nhất là để thiết lập) cách để chạy một đoạn mã trong một giao dịch trong mùa xuân là sử dụng 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

Cảm ơn bạn đã trả lời. Để hỗ trợ hình ảnh lớn hơn, dường như Spring tạo ra nhiều phức tạp hơn cho jdbc đơn giản. :) –

+0

@SurasinTancharoen: tốt, không thực sự. Tôi nói dễ nhất * để thiết lập *, nhưng không sử dụng. Với '@ Transactional' hoặc AOP, bạn có thể chạy một vài dòng mã trong một giao dịch đơn lẻ với những thay đổi nhỏ nhất đối với mã. –

+0

Tôi vừa đọc http://www.ibm.com/developerworks/java/library/j-ts2/index.html "Các giao dịch có lập trình với Mùa xuân" có thể thay thế không? –

Các vấn đề liên quan