2009-06-30 31 views
20

Chỉ cần tò mò nếu có ai khác có lỗi cụ thể này và biết cách giải quyết nó?Giao dịch phân phối đã hoàn tất. Hoặc là tranh thủ phiên này trong một giao dịch mới hoặc giao dịch NULL

Kịch bản là như sau ...

Chúng tôi có một ứng dụng web ASP.NET sử dụng Thư viện Enterprise chạy trên Windows Server 2008 IIS trang trại kết nối với SQL Server 2008 cụm lại kết thúc. MSDTC được bật. Kết nối DB được gộp chung.

Nghi ngờ của tôi là ở đâu đó dọc dòng có giao dịch MSDTC không thành công, kết nối đã được trả về hồ bơi và truy vấn tiếp theo trên một trang khác đang chọn kết nối không đúng và có lỗi cụ thể này. Điều thú vị là chúng tôi đã nhận lỗi này trên một truy vấn mà không cần bất cứ điều gì với giao dịch phân phối (cam kết hai cơ sở dữ liệu, vv). Chúng tôi chỉ đang thực hiện truy vấn chọn (không có giao dịch) khi chúng tôi gặp lỗi.

Chúng tôi đã làm hồ sơ SQL và truy vấn đã chạy trên máy chủ SQL, nhưng không bao giờ trở lại (vì giao dịch MSDTC đã bị hủy trong kết nối).

Một số lỗi khác có liên quan để đi cùng này là:

  • yêu cầu mới không được phép để bắt đầu vì nó nên đi kèm với mô tả giao dịch hợp lệ.
  • lỗi Provider
  • nội .Net Framework dữ liệu 60.
+0

Bạn có tìm thấy gì về điều này không? Tôi nhận được nó khi chèn các tập dữ liệu lớn hơn (> 10K hàng). – StingyJack

Trả lời

3

Một tiền thưởng có thể giúp được câu trả lời mà bạn tìm kiếm, nhưng có lẽ bạn sẽ nhận được câu trả lời tốt hơn nếu bạn đưa ra một số mẫu mã và đưa ra một mô tả tốt hơn về khi lỗi xảy ra.

Lỗi này chỉ xảy ra không liên tục? Có vẻ như nó từ mô tả của bạn.

Bạn có bao gồm đóng mà bạn muốn thực hiện dưới dạng giao dịch trong khối using TransactionScope như Microsoft đề xuất không? Điều này sẽ giúp tránh hành vi giao dịch kỳ lạ. Nhớ lại rằng khối using đảm bảo rằng đối tượng luôn được xử lý bất kể ngoại lệ được ném ra sao. Xem ở đây: http://msdn.microsoft.com/en-us/library/ms172152.aspx

Nếu bạn đang sử dụng TransactionScope có một cuộc tranh cãi System.TransactionScopeOption.RequiresNew mà nói với khuôn khổ để luôn tạo ra một giao dịch mới cho khối mã này:

Using ts As New Transactions.TransactionScope(Transactions.TransactionScopeOption.RequiresNew) 
     ' Do Stuff 
    End Using 

Ngoài ra, nếu bạn Nghi ngờ rằng một kết nối đang bị lỗi và sau đó đưa trở lại hồ bơi kết nối, giải pháp có khả năng là kèm theo mã có thể làm hỏng kết nối trong khối try-catch và Dispose kết nối trong khối catch.

+0

Chỉ cần làm rõ, tôi đã được thông báo rằng bạn muốn bỏ kết nối SQL của bạn chỉ trong trường hợp kết nối đi vào trạng thái bị lỗi; nếu không bạn sẽ không thể gộp các kết nối. –

0

Tôi đã thấy điều này trước đây và nguyên nhân chính xác là những gì bạn nghĩ. Như Rice đã đề xuất, hãy đảm bảo rằng bạn đang xử lý chính xác các đối tượng liên quan đến db để tránh vấn đề này.

3

MSDTC có thời gian chờ mặc định là 90 giây, nếu một truy vấn thực thi vượt quá giới hạn thời gian này, bạn sẽ gặp lỗi này khi giao dịch đang cố thực hiện.

+0

Điều này là dành cho tôi! (Bạn không chắc chắn tại sao điều này có một downvote.) – Vaccano

1

Câu hỏi cũ ... nhưng đã gặp sự cố này trong vài ngày qua.

Không thể tìm thấy câu trả lời hay cho đến bây giờ. Chỉ muốn chia sẻ những gì tôi phát hiện ra.

Kịch bản của tôi chứa nhiều phiên được mở bởi nhiều nhà máy phiên. Tôi phải quay lại một cách chính xác và đợi và đảm bảo các giao dịch khác không còn hoạt động nữa. Có vẻ như chỉ cần quay trở lại một trong số họ sẽ rollback tất cả mọi thứ.

Nhưng sau khi thêm Thread.Sleep() giữa rollbacks, nó không làm việc khác và tiếp tục tốt với rollback. Các lần truy cập tiếp theo kích hoạt phương thức không dẫn đến "Yêu cầu mới không được phép bắt đầu vì nó sẽ đi kèm với bộ mô tả giao dịch hợp lệ". lỗi.

https://gist.github.com/josephvano/5766488

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