2010-11-13 54 views
23

Chỉ cần hiểu hoạt động của các giao dịch Mùa xuân, tôi muốn biết điều gì sẽ xảy ra trong trường hợp sau khi một phương thức được đánh dấu là @Transactional gọi một phương thức khác được đánh dấu là @Transactional.Hiểu các giao dịch mùa xuân - Điều gì sẽ xảy ra khi một phương thức giao dịch gọi một phương thức giao dịch khác?

Giả sử cấu hình sử dụng tất cả các cài đặt mặc định.

@Service("myService") 
@Transactional 
public MyService{ 
    public void myServiceMethod(){ 
     myDAO.getSomeDBObjects(); 
    } 
} 

@Repository("myDAO") 
@Transactional 
public MyDAOWithUsesBeyondMyService{ 
    public void getSomeDBObjects(){...} 
} 

Bây giờ, nếu tôi nhập MyService.myServiceMethod() thì sẽ bắt đầu giao dịch rõ ràng. Sau đó, khi khoan vào myDAO.getSomeDBObjects() điều gì sẽ xảy ra? Thực tế là một giao dịch đã tồn tại không có giao dịch mới nào được sinh ra hay tôi đang tạo hai giao dịch tại đây?

Tài liệu (được trích dẫn bên dưới) về Tuyên truyền dường như đề cập đến điều này, nhưng tôi muốn xác minh sự hiểu biết của mình, đó là một chút ít cho bộ não trinh của tôi để hiểu tất cả cùng một lúc.

Tuyên truyền: Thông thường, tất cả các mã thực hiện trong một phạm vi giao dịch sẽ chạy trong giao dịch đó. Tuy nhiên, bạn có tùy chọn chỉ định hành vi trong trường hợp phương thức giao dịch được thực thi khi ngữ cảnh giao dịch đã tồn tại. Ví dụ: mã có thể tiếp tục chạy trong giao dịch hiện tại (trường hợp phổ biến ); hoặc giao dịch hiện tại có thể bị tạm ngừng và tạo giao dịch mới. Spring cung cấp tất cả các tùy chọn tuyên truyền giao dịch quen thuộc từ EJB CMT. Để đọc về ngữ nghĩa giao dịch tuyên truyền trong Mùa xuân, hãy xem Phần 10.5.7, “Tuyên truyền giao dịch”.

Trả lời

33

Hai câu trả lời:

a) không làm điều đó. Sử dụng @Transactional trong lớp dịch vụ hoặc lớp dao, nhưng không phải cả hai (lớp dịch vụ là lựa chọn thông thường, vì bạn có thể muốn một giao dịch cho mỗi phương thức dịch vụ)

b) nếu bạn làm điều đó, điều gì xảy ra tùy thuộc vào propagation thuộc tính của chú thích @Transactional và được mô tả trong phần này: 10.5.7 Transaction propagation. Về cơ bản: PROPAGATION_REQUIRED có nghĩa là cùng một giao dịch sẽ được sử dụng cho cả hai phương pháp, trong khi PROPAGATION_REQUIRES_NEW bắt đầu giao dịch mới.

Về ý kiến ​​của bạn:

Tất nhiên tôi vẫn tiếp tục đọc và nhận ra rằng, khi tôi đang sử dụng proxy, phương pháp thứ hai này sẽ không được quản lý bởi proxy giao dịch, do đó nó giống như bất kỳ khác gọi phương thức.

Điều đó không đúng trong trường hợp của bạn (chỉ khi cả hai phương thức đều nằm trong cùng một lớp).

Nếu một bean có phương pháp aba cuộc gọi b, sau đó b được gọi vào phương pháp thực tế, không phải là proxy, vì nó được gọi từ bên trong proxy (một bean không biết rằng nó được proxy với thế giới bên ngoài).

proxy  bean 
a() --> a() 
      | 
      V 
b() --> b() 

Trong trường hợp của bạn, tuy nhiên, một dịch vụ sẽ có một đối tượng dao tiêm, đó sẽ là một proxy riêng của mình, vì vậy bạn muốn có một tình huống như thế này:

  proxy  bean 
service a() --> a() 
         | 
      /---------/ 
      |     
      V 
dao  b() --> b() 
+0

Cảm ơn, vâng, tôi không có ý định làm điều này, nhưng câu hỏi xuất hiện khi tôi nhận ra rằng tôi đã khai báo @Transactional ở cấp độ dịch vụ và một phương thức của dịch vụ đang gọi một phương thức dịch vụ khác (cả giao dịch). Tất nhiên tôi vẫn đọc và nhận ra rằng, vì tôi đang sử dụng proxy, phương pháp thứ hai này sẽ không được quản lý bởi proxy giao dịch, vì vậy nó giống như bất kỳ cuộc gọi phương thức nào khác (đủ để làm rối loạn bộ não mới được bắt đầu). :) Nhưng nó làm tôi tò mò đủ để đảm bảo tôi hiểu chi tiết về cách nó hoạt động, bạn đã làm rõ rằng đối với tôi tốt. Cảm ơn! –

+0

@ David Tôi nghĩ rằng bạn hiểu lầm khái niệm proxy một chút. Đọc bản cập nhật của tôi. –

+0

Bạn hoàn toàn chính xác, bình luận của tôi là sai lầm (thực ra tôi đã chuyển những giả định mà không nói như vậy), nhưng tôi hiểu những gì bạn đang nói, và sau tất cả những điều đó, tôi nghĩ toàn bộ điều này cũng bắt nguồn từ đầu tôi. Cảm ơn bạn đã cập nhật và biểu đồ tuyệt vời, tôi chắc chắn nhiều người khác sẽ thấy nó hữu ích trong các tìm kiếm của họ trong tương lai! –

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