2011-08-23 46 views
5

Trong ứng dụng của tôi, có nhiều bước mà nhiều cam kết với cơ sở dữ liệu sẽ được thực hiện tuần tự thông qua nhiều phương thức. Ví dụ:Giao dịch lồng nhau sử dụng Spring và Hibernate

A -> B -> C 
     -> D 
      ->E 
     -> F 
    -> G 

Một cuộc gọi B gọi là C. Rồi B gọi D. D cuộc gọi E v.v. Tất cả các phương thức này đều có một số thao tác cơ sở dữ liệu. Khi tôi hiểu từ PROPAGATION_REQUIRED (quản lý giao dịch khai báo - cách đề xuất mùa xuân), nếu E hoàn tất thành công, giao dịch (và hoạt động trong E sẽ được cam kết). Bây giờ, do một số ngoại lệ, F sẽ dẫn đến một sự quay lại. Tôi muốn có mọi thứ cuộn lại bắt đầu từ những gì A đã làm. Điều này có thể thông qua quản lý giao dịch khai báo không? Hoặc tôi nên sử dụng Quản lý giao dịch có lập trình?

Cảm ơn bạn.

Trả lời

7

Đầu tiên, các giao dịch "lồng nhau", theo nghĩa là có nhiều giao dịch đang chạy phụ thuộc vào nhau, không được hỗ trợ, không được hỗ trợ.

Sau đó, propagation=REQUIRED nghĩa là tất cả các phương pháp với công tác tuyên truyền mục đích:

  • bắt đầu một giao dịch mới nếu không có tồn tại
  • tham gia vào một giao dịch hiện tại nếu như vậy tồn tại.

Điều này có nghĩa rằng trong kịch bản của mình, một sự thất bại trong F sẽ rollback toàn bộ giao dịch (vì nó là một giao dịch duy nhất, bắt đầu bởi A, và tuyên truyền với các phương pháp khác)

+0

tôi sẽ hoàn toàn đồng ý với bạn cho đến khi tôi đọc (ở đâu đó - không thể tìm thấy nó ở đâu) thì cam kết đó sẽ xảy ra ngay sau khi phương thức hoàn thành. Tôi nghĩ rằng tôi sai trong sự hiểu biết ở đây. Khi nào thì cam kết thực sự xảy ra (chúng ta không phải làm điều đó một cách rõ ràng. Đúng không?)? –

+1

cam kết sẽ xảy ra khi phương thức bắt đầu giao dịch hoàn tất. Đó là 'A' trong trường hợp này là – Bozho

+0

. tuyệt quá. Cảm ơn bạn rất nhiều. –

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