Зависает с помощью LINQ-SQL Server и TransactionScope - PullRequest
0 голосов
/ 17 марта 2010

Я сталкиваюсь с зависанием, когда программа пытается получить доступ к базе данных фруктов. Я уже включил сетевой доступ MSDTC как на своем компьютере разработчика, так и на сервере SQL Server.

Код: (простите за раскраску кода ... ТАК неправильно истолковывает мой VB .NET)

Using ts As New TransactionScope
            Dim fruit As New FruitDataContext
            Dim thingies As New ThingiesDataContext
            If (From f In fruit.tblApples Where f.Rotten = "Yes" AndAlso f.batch = 1).Count >= 1 Then
                'Record today's date as the day that the rotten apples were dumped.
            End If

            'Other complicated code that uses ThingiesDataContext and FruitDataContext

            du.SubmitChanges()
            ts.Complete()
End Using

Edit:

Я еще немного покопался, и оказалось, что проблема в линии LINQ. Когда я пытался просмотреть его с помощью LINQ to SQL Visualizer, я получаю следующую ошибку:

System.InvalidCastException: Specified cast is not valid.
   at LinqToSqlQueryVisualizer.SqlQueryInfo.deserialize(Stream stream)
   at LinqToSqlQueryVisualizer.Visualizer.Display(IDialogVisualizerService windowService, Stream rawStream)
   at LinqToSqlQueryVisualizer.DialogChooser.Show(IDialogVisualizerService windowService, IVisualizerObjectProvider objectProvider)
   at Microsoft.VisualStudio.DebuggerVisualizers.DebugViewerShim.ManagedShim.DelegatedHost.CreateViewer(IntPtr hwnd, HostServicesHelper hsh, SafeProxyWrapper proxy)

Я также отредактировал оператор LINQ, чтобы он был ближе к моему реальному коду.

Окончательное редактирование: Я попытался использовать обычное SqlConnection вместо "thingies as New ThingiesDataContext", и проблема все еще возникает.

Похоже, что TransactionScope не может обрабатывать несколько соединений SQL внутри одной транзакции.

Официальное примечание Microsoft

параллельные транзакции не поддерживаются SQL Server.

Из MSDN: http://msdn.microsoft.com/en-us/library/bb896149.aspx

1 Ответ

1 голос
/ 17 марта 2010

Это не проблема MSDTC. В противном случае вы получите сообщение о том, что DTC не включен и должен быть включен. Это также не проблема взаимоблокировки, потому что вы также получите конкретную ошибку по этому поводу.

Если бы мне пришлось угадывать, я бы сказал, что «Другой сложный код ...» пытается выполнить операцию базы данных и блокируется тем или иным объектом контекста базы данных.

Один из способов определить это - запустить SQL Profiler, чтобы увидеть, какие операторы SQL фактически выполняются на сервере, и проверить наличие блоков.

...