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