2012-09-14 35 views
5

Tôi có một quy trình đơn giản đọc từ một hàng đợi, xử lý các thông báo và kết quả đầu ra cho một thư khác. Tôi đang cố gắng để bọc này chuyển giao trong một TransactionScope, như vậy mà cả hai đọc từ hàng đợi đầu vào, và ghi vào hàng đợi đầu ra xảy ra trong cùng một giao dịch.TransactionScope nâng lên MSDTC khi gửi giữa các hàng đợi?

Tuy nhiên, có vẻ như MSDTC đang được sử dụng để thực hiện giao dịch này và kết quả là nó chậm hơn đáng kể so với sử dụng MessageQueueTransaction chuẩn. Điều này có nên xảy ra không? Tôi đã ấn tượng rằng TransactionScope sẽ chỉ nâng cấp lên một giao dịch bên ngoài nếu phạm vi liên quan, ví dụ, một hàng đợi tin nhắn đọc và một cơ sở dữ liệu viết, nhưng không phải nếu chỉ có nhiều hàng đợi tin nhắn có liên quan.

Cảm ơn.

EDIT: Đây là tất cả trên máy tính xách tay của tôi vào lúc này, vì vậy tôi chắc chắn rằng không có máy móc nào khác có liên quan.

Tôi cũng muốn thêm rằng tôi xác nhận rằng giao dịch leo thang đang diễn ra bằng cách kiểm tra trong phần '' Dịch vụ thành phần '' của Windows (tức là DTC/Danh sách giao dịch cục bộ). Tôi có thể thấy các giao dịch vào và rời khỏi màn hình này, điều mà tôi giả định có nghĩa là giao dịch đã được leo thang. Tôi có sai khi giả định điều này không?

CHỈNH SỬA 2: Tôi nhận được cùng một hành vi khi tôi chỉ viết vào một hàng đợi duy nhất! tức là

using (var ts = new TransactionScope()) 
{ 
    using (var q = new MessageQueue("...")) 
    { 
     /* write data */ 
    } 

    ts.Complete(); 
} 

Tôi có thể thấy DTC đang được sử dụng với ở trên, mặc dù hàng đợi đang ở trên máy cục bộ.

+0

Hàng đợi liên quan đến ứng dụng ở đâu? Cùng một máy? Máy khác nhau? –

+0

Bạn có đang sử dụng máy chủ được nhóm không? –

+0

Không, đây là tất cả nội bộ trên máy tính xách tay của tôi vào lúc này. Tôi đã cập nhật câu hỏi của tôi với một số làm rõ. – Barguast

Trả lời

3

Có vẻ như TransactionScope chỉ xử lý các giao dịch bên ngoài liên quan đến hàng đợi thư. Bạn phải sử dụng MessageQueueTransaction nếu bạn muốn nó chỉ là nội bộ. Điều này hoạt động khác với các giao dịch SQL, nơi giao dịch chỉ được leo thang nếu được yêu cầu, đó là điều làm tôi bối rối.

0

Có một cái nhìn bài viết này MSDN: Transaction Management Escalation

danh sách điển hình hành vi leo thang này, giống như (nổi bật là của tôi):

Khi bạn muốn cung cấp các giao dịch khác đối tượng trong một ứng dụng khác miền (bao gồm trên quy trình và ranh giới máy) trên cùng một máy tính, cơ sở hạ tầng System.Transactions tự động chuyển giao giao dịch được quản lý bởi Microsoft Điều phối viên giao dịch phân phối (MSDTC). Việc leo thang cũng xảy ra nếu bạn tranh thủ một người quản lý tài nguyên có độ bền cao khác. Khi leo thang, giao dịch vẫn được quản lý ở trạng thái được nâng lên cho đến khi hoàn tất việc hoàn tất .

Như bạn có thể thấy, độ cao có thể xảy ra không chỉ khi bạn đang làm việc trên mạng, mà ngay cả khi bạn đang làm việc trên cùng một máy. (Ví dụ, gần đây tôi gặp sự cố trong trường hợp tôi truy cập cơ sở dữ liệu MS SQL từ dịch vụ Windows trên cùng một máy chủ).

Điều này cũng có thể xảy ra nếu dịch vụ WCF liên quan đến một nơi nào đó trong tiến trình.

+0

Trong trường hợp này, nó là một chuyển từ một hàng đợi đến hàng đợi khác, cả hai đều nằm trên cùng một máy. Đây là hàng đợi kiểu MessageQueue, vì vậy WCF không đi vào nó. Tôi sẽ cung cấp cho các bài viết một đọc chi tiết hơn và xem nếu nó mang lại cho tôi một số manh mối. Cảm ơn. – Barguast

+0

RE: Bình luận của Jens về "cùng một máy". Một máy chủ nhóm được định nghĩa ít nhất hai máy (một hoặc nhiều vật lý, một hoặc nhiều ảo). –

+0

Hiện tại tôi đang thử nghiệm trên máy tính xách tay của tôi vì vậy tôi chắc chắn không có ranh giới máy bị vượt qua dù là ảo hay không. – Barguast