Sự khác biệt giữa yêu cầu_mới và lan truyền lồng nhau trong các giao dịch mùa xuân


80

Tôi không thể hiểu sự khác biệt về hành vi giữa chính sách tuyên truyền PROPAGATION_REQUIRES_NEWPROPAGATION_NESTEDtuyên truyền. Đối với tôi, dường như trong cả hai trường hợp, quy trình hiện tại được khôi phục nhưng không phải toàn bộ giao dịch. Có manh mối nào không?


7
Xem liên kết này: forum.springsource.org/archive/index.php/t-16594.html - Juergen Hoeller giải thích rất rõ
Ralph

@Ralph: cảm ơn bạn, đó chính xác là những gì tôi đang tìm kiếm. Bạn nên thêm nó như một câu trả lời.
Alexis Dufrenoy 12/09/12

1
@Ralph: tuyệt vời, đó sẽ là một câu trả lời tốt nhất.
Nandkumar Tekale

1
Vì vậy, sự khác biệt chính là với chính sách giao dịch lồng nhau, giao dịch có thể được quay trở lại từ đầu cho hoạt động nguyên tử hiện tại, giống như trong chính sách Requi_new, nhưng nó sẽ chỉ được cam kết vào cuối toàn bộ quá trình, điều này hoàn toàn khác với chính sách Requi_new, nơi mỗi hoạt động nguyên tử sẽ được cam kết khi nó kết thúc.
Alexis Dufrenoy 12/09/12

1
@Ralph rất tiếc, liên kết của bạn không còn trỏ đến một trang hiện có nữa :(
Diepttl

Câu trả lời:


117

Xem liên kết này: PROPAGATION_NESTED so với PROPAGATION_REQUIRES_NEW? Juergen Hoeller giải thích nó rất tốt. - Diễn đàn Nguồn Xuân hoàn toàn offline vào ngày 28 tháng 2 năm 2019, nhưng bạn có thể đọc phần liên quan của bài viết trong phần trích dẫn bên dưới

PROPAGATION_REQUIRES_NEW bắt đầu một giao dịch "nội bộ" mới, độc lập cho phạm vi đã cho. Giao dịch này sẽ được cam kết hoặc quay trở lại hoàn toàn độc lập với giao dịch bên ngoài, có phạm vi cách ly riêng, bộ khóa riêng, v.v. Giao dịch bên ngoài sẽ bị tạm dừng ở đầu giao dịch bên trong và tiếp tục lại khi giao dịch bên trong có đã hoàn thành. ...

Mặt khác, PROPAGATION_NESTED bắt đầu một giao dịch "lồng nhau", đó là một giao dịch con thực sự của giao dịch hiện có. Điều gì sẽ xảy ra là một điểm lưu sẽ được thực hiện khi bắt đầu giao dịch lồng nhau. Nếu giao dịch lồng nhau không thành công, chúng tôi sẽ quay trở lại điểm lưu đó. Giao dịch lồng nhau là một phần của giao dịch bên ngoài, do đó, nó sẽ chỉ được cam kết vào cuối giao dịch bên ngoài. ...


Câu trả lời hay và câu hỏi hay. Nhận xét của bạn và liên kết sau rất hữu ích đối với tôi: byteslounge.com/tutorials/…
yaki_nuka

nó có phải là hành vi đúng mà bạn đã mô tả trong tuyên truyền_requires_new không? vì khi tôi kiểm tra, nó sẽ khôi phục cả giao dịch.
eatSleepCode

hãy làm rõ hành vi giao dịch bên ngoài nếu giao dịch lồng nhau không (nó sẽ thất bại quá?) và ngược lại
gstackoverflow

Vì vậy, với giao dịch lồng nhau, khi hành động bên trong khôi phục, giao dịch bên ngoài tiếp tục tại điểm lưu trong khi khi giao dịch bên ngoài khôi phục, tất cả hành động được khôi phục lại, phải không?
Wecherowski

Bất kỳ sự khác biệt trong hành vi?
gstackoverflow

14

PROPAGATION_REQUIRES_NEW: sử dụng một giao dịch hoàn toàn độc lập cho từng phạm vi giao dịch bị ảnh hưởng. Trong trường hợp đó, các giao dịch vật lý cơ bản là khác nhau và do đó có thể cam kết hoặc khôi phục một cách độc lập, với giao dịch bên ngoài không bị ảnh hưởng bởi trạng thái hoàn trả của giao dịch bên trong.

PROPAGATION_NESTED: sử dụng một giao dịch vật lý duy nhất với nhiều điểm lưu mà nó có thể quay trở lại. Việc khôi phục một phần như vậy cho phép phạm vi giao dịch bên trong kích hoạt quá trình khôi phục cho phạm vi của nó, với giao dịch bên ngoài có thể tiếp tục giao dịch thực mặc dù một số hoạt động đã được khôi phục. Cài đặt này thường được ánh xạ vào các điểm lưu JDBC, vì vậy sẽ chỉ hoạt động với các giao dịch tài nguyên JDBC.

kiểm tra tài liệu mùa xuân


2
Có, tôi hiểu sự khác biệt được gạch dưới, nhưng tôi không thể thấy nó sẽ hoạt động khác nhau như thế nào: Trong một trường hợp, tôi sẽ khôi phục a về điểm lưu trước đó, trong trường hợp khác, tôi sẽ khôi phục giao dịch hiện tại chứ không phải giao dịch bên ngoài, nhưng thực sự, trong cả hai trường hợp, tôi sẽ quay trở lại điểm bắt đầu của hoạt động nguyên tử hiện tại và bắt đầu lại từ thời điểm đó.
Alexis Dufrenoy

1
@Traroth: Hai dòng trên liên kết của @Ralph sẽ cho biết sự khác biệt về hành vi. PROPAGATION_REQUIRES_NEW: Giao dịch bên ngoài sẽ bị tạm ngừng khi bắt đầu giao dịch bên trong và tiếp tục lại sau khi giao dịch bên trong hoàn tất. Mỗi giao dịch nội bộ được cam kết / khôi phục khi hoàn tất. PROPAGATION_NESTED: Giao dịch lồng nhau là một phần của giao dịch bên ngoài, do đó, nó sẽ chỉ được cam kết khi kết thúc giao dịch bên ngoài.
Nandkumar Tekale

Tôi đồng ý, vì vậy tôi đề nghị anh ấy đưa ra câu trả lời từ bình luận của anh ấy.
Alexis Dufrenoy

1
@Traroth: Tôi đồng ý với bạn. :) Anh ấy có câu trả lời tốt nhất.
Nandkumar Tekale

-6

Hãy tìm sự khác biệt

1.) Use of NESTED Transaction

Thực thi trong một giao dịch lồng nhau nếu giao dịch hiện tại tồn tại, hoạt động giống như PROPAGATION_REQUIRED khác. Giao dịch lồng nhau được hỗ trợ bởi Spring

2.) Sử dụng Giao dịch BẮT BUỘC Hỗ trợ giao dịch hiện tại, tạo một giao dịch mới nếu không có. . Nó có nghĩa là đối với miền ngân hàng như rút tiền, gửi tiền, cập nhật giao dịch

3.) Sử dụng REQUIRES_NEW Giao dịch Tạo một giao dịch mới và tạm dừng giao dịch hiện tại nếu có.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.