2012-06-29 25 views
5

Tôi đã đọc giao thức cam kết 3 giai đoạn trên wikipedia (http://en.wikipedia.org/wiki/Three-phase_commit_protocol) và đây là một kịch bản mà tôi nghĩ rằng 3PC sẽ bị lỗi:Giao thức cam kết 3 pha

Giả sử có hai người tham gia A và B và Điều phối viên C:

1) C gửi thông báo trước tới A và trước khi gửi thông báo trước tới B cả A và C tương ứng thất bại. 2) Giao dịch được khởi động lại và B kết thúc hủy bỏ nó vì không có trả lời từ A. 3) Cam kết giao dịch vì nó đã nhận được thông báo trước.

Đây không phải là vấn đề ban đầu trong 2PC mà 3PC được cho là phải giải quyết? 3PC giải quyết vấn đề như thế nào? Tôi đang thiếu gì. Cảm ơn.

Trả lời

2

Cập nhật:

Do những người tham gia không cam kết sau đó cho đến khi họ nhận được thông báo doCommit từ điều phối viên?

Sau khi nhận được thông báo preCommit, người tham gia sẽ đợi trước, và nếu hết thời gian chờ, họ sẽ tiếp tục cam kết.

nếu điều phối viên không thành công sau khi gửi thông báo trước và ít nhất một trong những người có thông báo trước, phần còn lại trong hệ thống có thể tiếp tục và cam kết vì họ đã biết trạng thái trên hệ thống.

Có, khi điều phối viên mới thấy rằng họ là người tham gia đã nhận được thông báo preCommit, nó sẽ gửi lại thông báo preCommit tới những người tham gia khác.

+0

Xin lỗi, tôi không rõ một chút về phần này của giao thức. Những người tham gia không cam kết sau đó cho đến khi họ nhận được thông điệp doCommit từ điều phối viên? –

+0

Tôi đoán có lẽ cách nó sẽ đi là nếu điều phối viên và tất cả những người tham gia biết trạng thái của một hệ thống thất bại thì giao dịch hủy bỏ một khi điều phối viên mới được bầu (tôi đoán phù hợp với những gì bạn nói). Và nếu điều phối viên không thành công sau khi gửi thông báo trước và ít nhất một trong những người có thông báo trước, phần còn lại trong hệ thống có thể tiếp tục và cam kết vì họ đã biết trạng thái trên hệ thống. Vì vậy, không có lúc nào là hệ thống đang ở trạng thái không xác định –

+0

@AbdulRahman xem các cập nhật của tôi – xvatar

0

Nếu điều phối viên gặp sự cố tại bất kỳ thời điểm nào, nút khôi phục có thể thực hiện giao dịch và truy vấn trạng thái từ mọi bản sao còn lại. Nếu một bản sao giao dịch đã bị hỏng, chúng tôi biết rằng mọi bản sao khác đã nhận được thông báo 'chuẩn bị cam kết' (nếu không điều phối viên sẽ không chuyển sang giai đoạn cam kết), và do đó nút khôi phục sẽ có thể xác định rằng giao dịch đã có thể được cam kết, và một cách an toàn giao cho giao thức kết luận của nó. Nếu bất kỳ bản sao nào báo cáo cho nút khôi phục nó chưa nhận được 'chuẩn bị cam kết', nút khôi phục sẽ biết rằng giao dịch chưa được cam kết ở bất kỳ bản sao nào và do đó có thể hủy bỏ hoặc bi quan chạy lại giao thức ngay từ đầu.

--cited từ http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

Vì vậy, tôi nghĩ rằng điều phối viên mới sẽ truy vấn trạng thái của nhóm người, chỉ khi tất cả các nhóm người sống đã nhận được tiền cam kết thông báo, sau đó điều phối viên mới sẽ gửi làm cam kết thông điệp; nếu không, giao dịch sẽ bị hủy bỏ.

0

3PC chỉ chịu đựng lỗi một điểm, chứ không phải lỗi đa điểm. Thực tế, để đảm bảo 3PC hoạt động, tất cả ba điều kiện sau đây phải được đáp ứng:

  1. không có lỗi mạng (tức làkhông có phân vùng mạng, mọi thông báo sẽ đến đích trước khi hết giờ nếu máy đích hoạt động (không bị lỗi))

  2. tối đa một người tham gia có thể không thành công (lỗi). Để làm cho nó chính xác, nếu điều phối viên không thành công (bị treo), tất cả các nhóm thuần tập không được thất bại

  3. máy tham gia có thể phân biệt giữa thời gian chờ và không thành công (tức là điện bị cắt) ngay sau khi hết thời gian chờ , nơi mà nó không thể viết bất cứ điều gì để lưu trữ liên tục để nhắc nhở bản thân rằng đó là một thời gian chờ thay vì một vụ tai nạn khi nó phục hồi)

không ai trong số những điều kiện mang tính thực tiễn. Vì vậy, tôi không nghĩ rằng 3PC có thể được thực hiện trong thế giới thực.

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