2008-09-11 34 views
12

Tôi hiểu, theo một cách mờ, cách hoạt động của các giao dịch ACID thông thường. Bạn thực hiện một số công việc trên một cơ sở dữ liệu theo cách mà công việc không được xác nhận cho đến khi một số loại cờ cam kết được thiết lập. Phần cam kết dựa trên một số giả định cơ bản (giống như một khối ghi đĩa đơn là nguyên tử). Trong trường hợp có lỗi nghiêm trọng, bạn chỉ có thể xóa dữ liệu không được cam kết trong giai đoạn khôi phục.Các giao dịch phân phối hoạt động như thế nào (ví dụ: MSDTC)?

Giao dịch phân phối hoạt động như thế nào? Trong một số tài liệu MS tôi đã đọc rằng bạn bằng cách nào đó có thể thực hiện một giao dịch trên cơ sở dữ liệu và hệ thống tập tin (trong số những thứ khác).

Công nghệ này có thể (và có thể là) được sử dụng cho trình cài đặt, nơi bạn muốn chương trình được cài đặt hoàn toàn hoặc vắng mặt hoàn toàn. Bạn chỉ cần bắt đầu một giao dịch khi bắt đầu trình cài đặt. Tiếp theo, bạn có thể kết nối với hệ thống tệp và đăng ký, thực hiện các thay đổi xác định cài đặt. Khi công việc được thực hiện, chỉ cần cam kết, hoặc khôi phục nếu cài đặt không thành công vì một lý do nào đó. Cơ quan đăng ký và hệ thống tệp được tự động làm sạch cho bạn bởi điều phối viên giao dịch phân phối ma thuật này.

Làm cách nào để có thể giao dịch hai hệ thống khác nhau theo cách này? Dường như với tôi rằng nó luôn luôn có thể để lại hệ thống trong một trạng thái không nhất quán, nơi hệ thống tập tin đã cam kết thay đổi của nó và đăng ký đã không. Tôi nghĩ rằng trong MSDTC nó thậm chí có thể thực hiện một giao dịch trên mạng.

Tôi đã đọc http://blogs.msdn.com/florinlazar/archive/2004/03/04/84199.aspx, nhưng cảm giác như chỉ bắt đầu giải thích và bước 4 sẽ được mở rộng đáng kể.

Chỉnh sửa: Từ nội dung tôi thu thập trên http://en.wikipedia.org/wiki/Distributed_transaction, có thể thực hiện bằng cam kết hai giai đoạn (http://en.wikipedia.org/wiki/Two-phase_commit). Sau khi đọc xong, tôi vẫn chưa hiểu phương thức 100%, có vẻ như có rất nhiều chỗ cho lỗi giữa các bước.

+0

Có * là * rất nhiều chỗ cho lỗi. Đặc biệt, nó dựa vào "COMMIT PREPARED" luôn hoạt động. Thực tế khác. –

Trả lời

3

Giới thiệu "bước 4":

Người quản lý giao dịch phối với các nhà quản lý tài nguyên để đảm bảo rằng tất cả thành công để làm yêu cầu làm việc hoặc không ai trong số các công việc nếu được thực hiện, do đó duy trì ACID tính chất.

Điều này tất nhiên yêu cầu tất cả người tham gia phải cung cấp các giao diện thích hợp và (không có lỗi) triển khai. Giao diện có vẻ mơ hồ như sau:

public interface ITransactionParticipant { 
    bool WouldCommitWork(); 
    void Commit(); 
    void Rollback(); 
} 

Người quản lý giao dịch tại thời điểm cam kết tất cả người tham gia có sẵn sàng giao dịch hay không. Những người tham gia chỉ có thể khẳng định điều này nếu họ có thể thực hiện giao dịch này trong tất cả các điều kiện lỗi cho phép (xác thực, lỗi hệ thống, v.v.). Sau khi tất cả người tham gia đã xác nhận khả năng cam kết giao dịch, người quản lý sẽ gửi thông báo Commit() tới tất cả người tham gia. Nếu bất kỳ người tham gia nào thay vào đó gây ra lỗi hoặc thời gian, toàn bộ giao dịch hủy bỏ và các thành viên cá nhân sẽ được khôi phục.

Giao thức này yêu cầu người tham gia phải ghi lại toàn bộ nội dung giao dịch trước khi xác nhận khả năng cam kết của họ. Tất nhiên điều này phải được trong một cấu trúc đặc biệt đăng nhập giao dịch địa phương để có thể phục hồi từ các loại thất bại.

+3

Điều gì sẽ xảy ra nếu bạn có người tham gia A và B, A được cam kết và trả về thành công, sau đó B được cam kết và trả về lỗi nhưng trước khi A có thể được khôi phục, mạng bị giảm? Một trường hợp khác sẽ là sự thất bại mạng có thể ngăn chặn B được cam kết. – BCS

+0

B có thể không thành công trên Commit() sau khi trả về true trên WouldCommitWork() và A sẽ không được cam kết trước khi tất cả người tham gia trả về true trên WouldCommitWork(). Tất cả các bước của giao thức có liên quan đến thời gian chờ gây ra tự động quay lại khi nhấn. Nếu một phần của cụm không thành công, nó sẽ phải phát lại nhật ký từ một thành viên không bị lỗi để có thể tham gia lại. Các nhóm chống lỗi chống lại lỗi byzantine là một chủ đề nghiên cứu nóng và đòi hỏi nhiều hơn hai người tham gia. –

+0

Cách duy nhất B có thể ngăn chặn thất bại là khóa bất kỳ thay đổi nào có thể gây ra lỗi, nhưng OK để làm xước tùy chọn đầu tiên. Lỗi phần cứng OTOH vẫn còn. - Các trường hợp tôi quan tâm là nơi bất kỳ liên kết nào có thể bị lỗi trong khi cả hai hệ thống tiếp tục cung cấp dịch vụ cho các khách hàng khác. Trong trường hợp đó, hệ thống cần được kết hợp ngay cả khi liên kết bị giảm xuống. Tôi không thấy làm thế nào họ có thể đồng ý về nếu giao dịch được cam kết và chắc chắn rằng mọi người đến cùng một kết luận. – BCS

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