2011-07-20 23 views
13

Tôi có một quy trình máy chủ phải thực hiện rất nhiều truy vấn cơ sở dữ liệu, nó sử dụng TPL để chạy các công cụ song song. Nó đã được làm việc tốt cho tất cả các năm nay, cho đến ngày hôm nay khi nó bị rơi hai lần trong một khoảng 30 phút với ngoại lệ sau đây.Giao dịch SqlException bị bế tắc trên tài nguyên bộ đệm truyền thông

Cơ sở dữ liệu được cấu hình để đăng nhập bất kỳ deadlocks nào, nhưng nó không ghi nhật ký gì cả, vì vậy có vẻ như bế tắc này chỉ xảy ra ở phía máy khách?

Tôi không thể tìm thấy bất kỳ tham chiếu nào đến ngoại lệ này ngoài một số msdn forum post that doesn't provide any information.

Có ai đã xem ngoại lệ này trước đây không? Hoặc biết những gì tôi có thể làm để tìm hiểu thêm thông tin về nó?

---> System.AggregateException: One or more errors occurred. 

---> System.Data.SqlClient.SqlException: Transaction (Process ID 89) was deadlocked on communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.HasMoreRows() 
    at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) 
    at App.CoreEngine.V5.DataAccess.SqlReader.Read(String readerDescription) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\SqlReader.cs:line 121 
    at App.CoreEngine.V5.DataAccess.DataContext.ExecuteQuery(PtQuery query, ValueStore`1 store, String readerDescription) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 328 
    at App.CoreEngine.V5.DataAccess.DataContext.<>c__DisplayClass12.<GetCalculatedDataForCompare>b__f(Object _) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 267 
    at System.Threading.Tasks.Task.Execute() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at App.CoreEngine.V5.DataAccess.DataContext.GetCalculatedDataForCompare() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 276 
    at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj) 
    at System.Threading.Tasks.Task.Execute() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at System.Threading.Tasks.Task`1.get_Result() 
    at App.CoreEngine.V5.DataAccess.DataContext.get_CalcCompareData() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 389 
    at App.CoreEngine.V5.Calculation.CalculationEngine.Run() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\Calculation\CalculationEngine.cs:line 243 
    at App.CoreEngine.V5.Processor.Milestone.BatchRunner.Run() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\Processor\Milestone\BatchRunner.cs:line 171 

---> (Inner Exception #0) System.AggregateException: One or more errors occurred. 
---> System.Data.SqlClient.SqlException: Transaction (Process ID 89) was deadlocked on communication buffer resources with another process and has been chosen as the deadlock victim. Rerun the transaction. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.HasMoreRows() 
    at System.Data.SqlClient.SqlDataReader.ReadInternal(Boolean setTimeout) 
    at App.CoreEngine.V5.DataAccess.SqlReader.Read(String readerDescription) in C:\SourceCode\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\SqlReader.cs:line 121 
    at App.CoreEngine.V5.DataAccess.DataContext.ExecuteQuery(PtQuery query, ValueStore`1 store, String readerDescription) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 328 
    at App.CoreEngine.V5.DataAccess.DataContext.<>c__DisplayClass12.<GetCalculatedDataForCompare>b__f(Object _) in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 267 
    at System.Threading.Tasks.Task.Execute() 
    --- End of inner exception stack trace --- 
    at System.Threading.Tasks.Task.WaitAll(Task[] tasks, Int32 millisecondsTimeout, CancellationToken cancellationToken) 
    at CoreEngine.V5.DataAccess.DataContext.GetCalculatedDataForCompare() in C:\SourceCode\AppV1\Releases\Libraries\CoreEngine\CoreEngine.V5\DataAccess\DataContext.cs:line 276 
    at System.Threading.Tasks.Task`1.InvokeFuture(Object futureAsObj) 
    at System.Threading.Tasks.Task.Execute() 

EDIT - Tôi chỉ cần kích đúp kiểm tra rằng dbcc 1222 được bật cho các máy chủ này đã xảy ra vào, tôi chạy dbcc tracestatus và nhận được:

TraceFlag Status Global Session 
1222 1 1 0 
3605 1 1 0 

Và không có gì trong các bản ghi báo cáo là deadlocks

+0

Bất kỳ thay đổi mã nào được thực hiện? Các bản vá lỗi nghiêm trọng? Bạn có thể kiểm tra trên một khôi phục để xem nếu kế hoạch thực hiện chanes? Phiên bản SQL Server nào? – gbn

+0

Không có thay đổi hoặc cắt đứt bản vá lỗi mà tôi biết, SQL Server 2008 R2 – BrandonAGr

+0

Cũng có một thay đổi đã xóa ConnectionTimeout khỏi chuỗi kết nối cũng gây ra sự cố, vì vậy chúng tôi phải thêm ConnectionTimeout trở lại, như [ được mô tả ở đây] (http: // stackoverflow.com/questions/6864672/failover-partner-hành vi-cho-sql-connectionstring-với-connectiontimeout), nhưng điều đó dường như không liên quan đến điều này – BrandonAGr

Trả lời

7

Tôi đoán là kế hoạch thực hiện hiện sử dụng song song, trong khi trước khi nó không đáp ứng được ngưỡng chi phí.

Hãy thử MAXDOP 1 trong các truy vấn

Edit, sau khi bình luận

Bạn cũng cần phải theo dõi cờ 1204.

TF 1222 cho đồ thị bế tắc nhưng với "truyền thông tài nguyên đệm" bế tắc này có thể không phải là 2 đối tượng liên quan (tôi đoán ở đây nó không phải là một xung đột chỉ mục/bảng). Xem http://msdn.microsoft.com/en-us/library/ms178104.aspx

Ngoài ra còn có các TF không có giấy tờ 1205 mang đến cho biết thêm vào các bản ghi lỗi

+0

Kế hoạch chắc chắn bao gồm song song, vấn đề chính là lỗi này đã xảy ra chỉ 3 thời gian trong 5 tháng qua, vì tôi không thể tái tạo một cách hợp lý vấn đề chỉ cần thay đổi cài đặt sẽ không cho phép tôi xác định xem nó có xảy ra lần nữa hay không. Điều gây phiền nhiễu chính là thiếu đăng nhập khi có bế tắc mặc dù tôi đã đặt TraceFlag để đăng nhập deadlocks, và nó đã ghi lại các loại deadlocks khác nhau trong quá khứ – BrandonAGr

+0

@BrandonAGr: Xem cập nhật, xin vui lòng – gbn

1

Trong trường hợp của tôi, quá trình xóa một số bản ghi & sau đó chèn bản ghi vào một bảng & nó đã xảy ra từ môi trường nhiều luồng.

Tôi phải thêm chỉ mục không được nhóm vào bảng trên các cột đang được sử dụng để xóa đã giải quyết được sự cố của tôi.

+0

Điều này cũng làm việc cho tôi. (Ứng dụng của tôi là nhiều máy khách kết nối với một cơ sở dữ liệu máy chủ SQL đơn.) Bất kỳ ai có bất kỳ ý tưởng nào tại sao điều này khắc phục được sự cố? – Jeff

+1

Xóa hiện đang sử dụng chỉ mục thay vì quét bảng .. –

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