Wydaje się, że moja konfiguracja brakowało tej linii:
<tx:annotation-driven transaction-manager="txManager"/>
Następnie w moich klas usług, używam @Transactional adnotacja. Na przykład
@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
}
}
Jeśli istnieje wyjątek dzieje w addCompany_fail(), pierwszy addCompany() jeden będzie również rollbacked.
Postępowałem zgodnie z tym dokumentem, aby zrozumieć, w jaki sposób transakcja była kontrolowana na wiosnę. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html
Poszedłem za tym dokumentem, aby zrozumieć, jak kodować w JDBC na wiosnę. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html
Przeczytałem również (bezpłatnie) http://www.infoq.com/news/2009/04/java-transaction-models-strategy. Jest naprawdę dobry. Czuję to samo z pisarzem, którego większość ludzi nie rozumie (lub nie dba o transakcję).
PS: Wydaje się, że wiele osób nie rozumie, że korzystanie z takiego środowiska Hibernuj/Spring służy tylko uniknięciu złożoności JDBC i kontroli transakcji. Wielu ludzi myśli, że "JDBC i Transakcja są tak złożone, po prostu użyj Hibernate i zapomnij o tych dwóch". Wiele przykładów w Internecie o Spring + Hibernate lub Spring + JDBC na pozór nie dba o transakcję. Czuję, że to kiepski żart. Transakcja jest zbyt poważna, by po prostu pozwolić sobie z nią poradzić bez prawdziwego zrozumienia.
Hibernacja i wiosna są tak potężne i tak złożone. Następnie, jak ktoś powiedział: "Wielka moc pochodzi z obowiązków".
AKTUALIZACJA: 2013-08-17: Istnieje dobry przykład transakcji tutaj http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial. Jednak nie jest to wytłumaczyć, że jeśli chcesz używać REQUIRES_NEW, dlaczego trzeba utworzyć inną klasę (inaczej dostaniesz ten problem Spring Transaction propagation REQUIRED, REQUIRES_NEW, którym wydaje REQUIRES_NEW naprawdę nie tworzyć nowej transakcji)
UPDATE: 2018 -01-01: Stworzyłem pełny przykład z Spring Boot 1.5.8.UDOSTĘPNIJ tutaj https://www.surasint.com/spring-boot-database-transaction-jdbi/ i kilka podstawowych przykładów eksperymentu tutaj https://www.surasint.com/spring-boot-connection-transaction/
I to zadziałało, ponieważ menedżer transakcji Spring wyłącza automatyczne zatwierdzanie i robi własne zatwierdzenia? – Raedwald