2009-12-25 30 views
11
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="data.emf" /> 
</bean> 

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


<bean id="transactionManager2" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="data.emf" /> 
</bean> 

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


Trong lớp dịch vụ của tôi, tôi có thể sử dụng @Transactional(name="transactionManager2"); để xác định giao dịch quản lý tôi sử dụng nếu tôi có nhiều nhà quản lý giao dịch?mùa xuân nhiều datasources @Transactional

+2

Tại sao bạn cho rằng mình cần hai người quản lý giao dịch? – duffymo

Trả lời

21

Bạn có thể chỉ định tx quản lý để sử dụng với @Transactional sử dụng value attribute:

Một giá trị vòng loại cho các quy định giao dịch.

Có thể được sử dụng để xác định người quản lý mục tiêu giao dịch, phù hợp với giá trị vòng loại (hoặc tên đậu) của một cụ PlatformTransactionManager định nghĩa bean.

Ví dụ:

@Transactional("txManager1"); 

Ngoài ra, bạn có thể sử dụng rõ ràng hơn TransactionProxyFactoryBean, mang đến cho bạn điều khiển-grained tốt hơn những gì các đối tượng được đại diện bởi những gì tx nhà quản lý. Điều này vẫn sử dụng các chú thích, nhưng nó không tự động phát hiện các bean, nó được cấu hình một cách rõ ràng trên cơ sở từng bean.

Điều này thường không phải là vấn đề, nhưng bạn không nên có nhiều người quản lý giao dịch trừ khi bạn có lý do chính đáng để làm như vậy. Nếu bạn thấy mình cần hai người quản lý tx, thì tốt hơn bạn nên xem bạn có thể làm gì với một người quản lý hay không. Ví dụ: nếu bạn có hai nguồn dữ liệu được định cấu hình trong máy chủ ứng dụng của mình, bạn có thể kết hợp cả hai trong một JtaTransactionManager, thay vì hai riêng biệt JpaTransactionManager hoặc DataSourceTransactionmanagers.

+0

vui lòng nhận xét về bài đăng của tôi tại http://stackoverflow.com/questions/1962509/which-sessionfactory-should-be-use-for-transactionmanager – cometta

+0

tôi đọc từ http://stackoverflow.com/questions/1902997/multiple- database-with-springhibernatejpa, nó sử dụng nhiều org.springframework.orm.jpa.JpaTransactionManager và sẽ được chỉ bởi @transactional ("name"). vì vậy cách này là ok? – cometta

+1

@skaffman, làm cách nào tôi có thể kết hợp hai nguồn dữ liệu với cùng một người quản lý nếu tôi đang sử dụng DataSourceTransactionManager? – tsunade21

1

Thông tin thêm về sự cần thiết của nhiều người quản lý giao dịch. Bạn có thể đang cố gắng thực hiện các giao dịch lồng nhau hoặc riêng biệt theo thứ tự - sau đó bạn có thể sử dụng các cài đặt tuyên truyền khác nhau. Bạn có thể đạt được điều đó với cấu hình bằng cách sử dụng trình quản lý giao dịch đơn lẻ, xem Transaction propagation.

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