2010-01-02 25 views
5

Tôi không thể tìm thấy câu trả lời cuối cùng cho tài liệu này và mặc dù có vẻ là câu trả lời hợp lý nhưng không thể chắc chắn. Trường hợp này là - bạn có định nghĩa giao dịch dựa trên xml, như:Định nghĩa giao dịch dựa trên chú giải và dựa trên xml ưu tiên

<tx:advice id="txAdvice" transaction-manager="jpaTransactionManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 

Lời khuyên nào là tất cả các phương pháp dịch vụ. Nhưng sau đó bạn có @Transactional trên một lớp/phương pháp cụ thể, nơi bạn muốn ghi đè thuộc tính propagation.

Rõ ràng là @Transactional ở cấp phương pháp ghi đè cùng một mức ở cấp lớp, nhưng có ghi đè lên <tx:advice> (và thực tế, <aop:pointcut>) không?

Tôi hy vọng hai tên lửa đánh chặn sẽ không được tạo ra trên cùng lớp, (và bất cứ xảy ra là đầu tiên sẽ bắt đầu giao dịch)

Trả lời

4

Cảm ơn skaffman vì nỗ lực của anh ấy. Cuối cùng tôi nghĩ rằng tôi có các hành vi:

  1. Cả <aop:advisor>@Transactional (cùng với <tx:annotation-driven>) tạo ra một TransactionInterceptor quanh lớp đối tượng (một, mà phương pháp này được chạy trong giao dịch).
  2. Lời khuyên với thuộc tính thấp hơn order ghi đè thuộc tính còn lại. Nếu không có thuộc tính thứ tự nào được chỉ định, thứ tự là không xác định. Nhưng thử nghiệm của tôi cho thấy một định nghĩa mới nhất trong applicationContext.xml được ưu tiên, mặc dù điều này có thể không phải là trường hợp luôn:

Khi hai mảnh lời khuyên được định nghĩa trong các khía cạnh khác nhau cả hai cần phải chạy cùng tham gia điểm , trừ khi bạn chỉ định nếu không thứ tự thực hiện là không xác định.

Ít nhất đây là hành vi của mùa xuân 2.5.6.

3

Sau một chút đào, tôi nghĩ rằng câu trả lời nằm trong TxAdviceBeanDefinitionParser.doParse. Logic nói:

if <tx:attributes> is present then 
    parse <tx:attributes> 
else 
    instantiate an AnnotationTransactionAttributeSource to determine TX attributes 

Với điều duy nhất mà đọc @TransactionalAnnotationTransactionAttributeSource, hàm ý mạnh mẽ với tôi rằng <tx:advice> sẽ tham khảo ý kiến ​​@Transactional khi và chỉ khi <tx:attributes> không được xác định, vì vậy không quan trọng nhất là có thể.

Điều này dường như mâu thuẫn với cách tiếp cận "nguyên tắc ít ngạc nhiên nhất" của Spring, vì như bạn đã dự kiến ​​chú thích sẽ được ưu tiên trên cơ sở mỗi lớp hoặc theo phương thức. Tôi sẽ gửi một vấn đề về JIRA của họ để thay đổi hành vi này.

Có nói tất cả điều đó, tôi vẫn nghĩ rằng nó có giá trị cho việc này một thử xem những gì nó làm, vì nó có thể làm việc bởi một số cơ chế khác.

+0

thú vị, nó hoạt động như chúng tôi đã mong đợi. Bây giờ tôi sẽ làm một số đào cũng như để xem những gì nhiều hơn nữa là để TxAdviceBeanDefinitionParser .. – Bozho

+0

Tôi tự hỏi nếu proxy được tạo ra bởi 'TxAdviceBeanDefinitionParser' là kiểm tra đậu mục tiêu cho chú thích khi được gọi. – skaffman

+0

nó quay ra đoán của tôi về hai TransactionInterceptors được tạo ra là sự thật. Tôi đã đặt câu hỏi (bao gồm các phát hiện mới của tôi) tại diễn đàn mùa xuân và sẽ cập nhật cho bạn kết quả. – Bozho

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