2010-08-27 36 views
5

Tôi có ứng dụng C# đa luồng trong đó mỗi luồng có tập hợp các kết nối db riêng. Mỗi luồng sử dụng TransactionScope/DTC. Đôi khi, tôi nhận được một "Giao dịch đã hủy bỏ" ngoại lệ. Nó không phải từ một thời gian chờ vì nó xảy ra trong vòng chưa đầy 2 giây kể từ khi bắt đầu giao dịch.Giao dịch đã hủy bỏ

Đây là stacktrace:

tại System.Transactions.TransactionStateAborted.BeginCommit (InternalTransaction tx, Boolean asyncCommit, AsyncCallback AsyncCallback, Object asyncState) tại System.Transactions.CommittableTransaction.Commit() tại System.Transactions.TransactionScope.InternalDispose() tại System.Transactions.TransactionScope.Dispose() tại MyNamespace.CallingMethod()

Điều này xảy ra rất thường xuyên, giả sử một lần trong 100.000 giao dịch.

Môi trường: Windows Server 2003 Net 2.0 Kết nối với SQLServer 2005

Bất kỳ ý tưởng về tại sao điều này xảy ra? Cảm ơn!

+0

hiện SQL, DTC, hoặc hệ điều hành bản ghi lỗi có bất kỳ chi tiết bổ sung? – StingyJack

+0

bất kỳ mục nhập nào trong Nhật ký Sự kiện với dấu thời gian đó? –

+0

Hộp sản xuất, vì vậy thật khó để có được bất kỳ thông tin nào ở đó mà không có băng đỏ. Tôi sẽ xem nếu tôi có thể nhận được bất cứ điều gì từ Event Log, đó là dễ dàng hơn. Cảm ơn! – Dan

Trả lời

0

Tôi nghĩ điều này là do sự bất ổn định của mạng. Nó là rất không thường xuyên, và đã không nuôi dưỡng đầu xấu xí của nó trong một vài tháng nay.

1

Đây có phải là ngăn xếp cuộc gọi từ InnerException bên trong nhất của bạn không? Tôi bạn nhận được ngoại lệ này, thường có (không phải luôn luôn, mặc dù) một InnerException với nhiều thông tin hơn.

Đặt cược của tôi sẽ bị bế tắc cơ sở dữ liệu.

+0

Vâng, đây là ngoại lệ nhất bên trong. Tôi có quyền truy cập vào dấu vết bế tắc và không tìm thấy dấu vết nào trong thời gian này. – Dan

1

Bạn có thể tạo một bãi chứa bộ nhớ, các hướng dẫn có thể được tìm thấy ở đây http://blogs.msdn.com/b/joncole/archive/2007/03/29/creating-a-process-memory-dump.aspx

Sau đó, bạn có thể kiểm tra với windbg để lộ những gì gốc ngoại lệ gây ra vấn đề này. Có rất nhiều thông tin hữu ích về cách sử dụng windbg kiểm tra ngoại lệ được quản lý.

trong thời gian chờ đợi, bạn có thể sử dụng trình thu thập thông tin sql để theo dõi xem có bất kỳ lỗi sql nào xảy ra trong khoảng thời gian khi ngoại lệ được ném hay không.

+0

Tôi thích ý tưởng này. Tôi sẽ thử lại và tạo lại điều này trong dev và nhận được câu trả lời cho vấn đề này. – Dan

+0

Nếu bạn có bộ nhớ kết xuất, tôi có thể kiểm tra nó cho bạn. bạn có thể đặt nó trên thư mục công cộng skydrive. –

0

Như Andreas đã nói, hãy xem InnerExceptions. Ngoài ra móc lên SQL Profiler và tìm bất kỳ deadlocks/chấm dứt.

1

Nếu bạn gặp phải sự cố này, vui lòng lưu ý rằng tôi đã tìm được giải pháp và vấn đề .. Trong tệp cấu hình ứng dụng, thuộc tính cho chuỗi kết nối bị thiếu "Enlist".

Trước đó, chuỗi kết nối là = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;" providerName="System.Data.SqlClient" />

Bây giờ chuỗi kết nối cập nhật là = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;Enlist=False;" providerName="System.Data.SqlClient" />

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