2012-03-10 18 views
12

Używam Spring z JDBC i stwierdziłem, że jest autocommit.Jak mogę skonfigurować, aby wyłączyć automatyczne zatwierdzanie w Spring + JDBC?

Jak mogę skonfigurować, aby wyłączyć to w spring-servlet.xml?

To moja obecna konfiguracja:

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

Odpowiedz

14

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/

+0

I to zadziałało, ponieważ menedżer transakcji Spring wyłącza automatyczne zatwierdzanie i robi własne zatwierdzenia? – Raedwald

2

Nie można po prostu uruchomić swój kod w ramach transakcji, Wiosna automatycznie wyłączyć auto-commit dla Ciebie. Najprostszym (przynajmniej do set-up) sposób prowadzenia kawałek kodu w transakcji na wiosnę jest użycie 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

Dzięki za odpowiedź. Aby wesprzeć większy obraz, wydaje się, że Spring tworzy znacznie więcej komplikacji dla prostego jdbc. :) –

+0

@SurasinTancharoen: cóż, niezupełnie. Powiedziałem najłatwiej * do ustawienia *, ale nie do użytku. Za pomocą '@ Transactional' lub AOP można uruchomić kilka linii kodu w ramach jednej transakcji z minimalnymi zmianami w kodzie. –

+0

Właśnie przeczytałem ten http://www.ibm.com/developerworks/java/library/j-ts2/index.html Czy "Programatyczne transakcje ze sprężyną" mogą być alternatywą? –

Powiązane problemy