2011-06-22 42 views
8

Tôi muốn hiểu việc sử dụng giao dịch mùa xuân với Hỗ trợ tuyên truyền. Các tài liệu java đề cập rằng nếu phương thức có @Transactional(propagation = Propagation.SUPPORTS) được gọi từ bên trong một giao dịch, nó hỗ trợ giao dịch nhưng nếu không có giao dịch nào tồn tại, thì phương thức này được thực hiện không giao dịch.Giao dịch mùa xuân với sự hỗ trợ Tuyên truyền

Đây không phải là hành vi của các giao dịch mùa xuân không phân biệt Propagation.SUPPORTS?

 


public class ServiceBean { 

    @Transactional(propagation = Propagation.SUPPORTS) 
    public void methodWithSupportsTx() { 
     //perform some database operations 
    } 
} 

public class OtherServiceBean { 

    @Transactional(propagation = Propagation.REQUIRED) 
    public void methodWithRequiredTx() { 
     //perform some database operations 
     serviceBean.methodWithSupportsTx(); 
    } 
} 

 

Trong ví dụ mã trên, bất kể methodWithSupportsTx()@Transactional(propagation = Propagation.SUPPORTS) chú thích nó sẽ được thực hiện trong một giao dịch tùy thuộc vào việc methodWithRequiredTx()@Transactional chú thích, phải không?

Vì vậy, nhu cầu/sử dụng có mức độ tuyên truyền SUPPORTS là gì?

Trả lời

0

Giao dịch bắt buộc sẽ tạo giao dịch mới nếu không có giao dịch nào. Do đó một giao dịch mới sẽ được thực hiện khi bạn gọi serviceBean.methodWithSupportsTx(). Nếu phương pháp của bạn thực sự giao dịch, bạn sẽ thấy lỗi từ mùa xuân nếu không có giao dịch nào tồn tại.

+0

Tôi không nghĩ vậy. Một lỗi chỉ được ném khi mức lan truyền KHÔNG BAO GIỜ. PROPAGATION.SUPPORTS cũng không tạo giao dịch mới. –

4

Từ javadoc:

Lưu ý: Đối với các nhà quản lý giao dịch với đồng bộ hóa giao dịch, PROPAGATION_SUPPORTS hơi khác so với không có giao dịch nào cả, vì nó định nghĩa một phạm vi giao dịch đó đồng bộ hóa sẽ được áp dụng cho. Kết quả là, các tài nguyên giống nhau (JDBC Connection, Hibernate Session, v.v.) sẽ được chia sẻ cho toàn bộ phạm vi được chỉ định. Lưu ý rằng điều này phụ thuộc vào cấu hình đồng bộ hóa thực tế của trình quản lý giao dịch.

Vì vậy, điều đó có nghĩa là, ví dụ: nhiều lần gọi Hibernate's SessionFactory.getCurrentSession() bên trong methodWithSupportsTx() sẽ trả lại cùng một phiên.

+0

Phương pháp giả địnhWithSupportsTx() không có chú giải @Transactional là bạn đang cố gắng nói rằng cùng một phiên sẽ KHÔNG được trả về khi methodWithSupportsTx() được gọi trong một giao dịch? –

+0

@Amit: Trên thực tế, không có '@ Transactional' cố gắng gọi' getCurrentSession() 'với cấu hình điển hình của' HibernateTransactionManager' sẽ tạo ra một "No Hibernate Session bị ràng buộc với thread, và cấu hình không cho phép tạo một giao dịch không ở đây" ngoại lệ. – axtavt

+0

Không có nghĩa là, nếu không có chú thích @Transactional trên phương thức methodWithSupportsTx() và phương thức này được gọi từ một phương thức khác đã có trong một giao dịch, sẽ không ngủ đông trả về cùng một phiên làm cho nhiều lời gọi của SessionFactory.getCurrentSession của Hibernate(). Đây chính xác là ví dụ tôi nêu trong câu hỏi của tôi ở trên - Chú giải @Transactional trên phương thức methodWithRequiredTx() tạo một giao dịch mới và sau đó gọi phương thức serviceBean.methodWithSupportsTx() do đó mã được thực hiện bởi methodWithSupportsTx() đã có trong giao dịch, đúng không? –

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