2012-09-26 26 views
5

Mam dwa menedżer transakcji zdefiniowane w dwóch oddzielnych plików wiosna xml, a oboje załadowany do kontekście wiosennejwiosna problem menedżer stwardnienie transakcja

jeden plik

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

    <bean id="transactionManager1" 
     class="org.springframework.jdbc.DataSourceTransactionManager"> 
    ... 
    </bean> 

Plik Dwa

<tx:annotation-driven transaction-manager="transactionManager2"/> 
    <bean id="transactionManager2" 
      class="org.springframework.jdbc.DataSourceTransactionManager"> 
    ... 
    </bean> 

Jeśli nie wskazałem żadnego kwalifikatora dla poniższej usługi, która będzie używana jako wiosna menedżera transakcji.

public class TransactionalService { 

    @Transactional 
    public void setSomething(String name) { ... } 

    @Transactional 
    public void doSomething() { ... } 
} 

Odpowiedz

13

Wyjazd 11.5.6 Using @Transactional z oficjalnej dokumentacji:

Można pominąć ten atrybut w tagu <tx:annotation-driven/>transaction-manager jeśli nazwa fasola z PlatformTransactionManager który chcesz drut ma nazwę transactionManager. Jeśli PlatformTransactionManager fasola, że ​​chcesz z zależnościami-inject ma żadnego innego imienia, to trzeba użyć atrybutu transaction-manager wyraźnie [...]

Ponieważ żaden z menedżerów transakcji wyrazami są nazwane transactionManager, należy określić, które Menedżer transakcji powinien być używany dla metod oznaczonych jako @Transactional.


AKTUALIZACJA: aby odpowiedzieć na zmienione pytanie. Można określić, które transakcja menedżer do wykorzystania na @Transactional adnotacji (patrz: @Transactional.value()):

@Transactional("transactionManager1") 
//... 

@Transactional("transactionManager2") 
//... 

Jednak widzę kilka problemów z aktualnej konfiguracji:

  • zdefiniować <tx:annotation-driven/> dwukrotnie różnych menedżerów transakcji. Nie sądzę, że taka konfiguracja jest ważna

  • bez wyraźnego podania menedżera transakcji, z którego należy skorzystać?

Rozwiązanie Myślę, że powinniśmy pracować jest zdefiniowanie <tx:annotation-driven transaction-manager="transactionManager1"/> raz i używać @Transactional użyć pierwszego kierownika i @Transactional("transactionManager2") użyć drugi. Albo na odwrót.

+0

OK, wprowadziłem modyfikację mojego pytania, tak naprawdę to jest problem, z którym stoję. – user1330526

+0

@ user1330526: zobacz moje aktualizacje –

+0

Potrzebuję zdefiniować wiele '' tx: adnotacja-sterowana transakcja-manager = "twojaTxMgrName" /> 'dla wielu menedżerów transakcji, inaczej Spring nie widzi moich menedżerów transakcji. –