2010-03-17 7 views
0

Je rencontre un blocage lorsque le programme tente d'accéder à la base de données fruit. J'ai déjà activé l'accès réseau MSDTC sur mon ordinateur de développement et le serveur SQL Server.Se bloque avec LINQ-SQL Server et TransactionScope

code: (pardon la coloration de code ... SO-ce mal interpréter mon 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:

J'ai creusé autour d'un peu plus et il se trouve que le problème se trouve dans la ligne de LINQ. Lorsque j'ai essayé de voir avec le LINQ to SQL Visualizer, je reçois l'erreur suivante:

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) 

J'ai également édité la déclaration LINQ être plus proche de mon code réel.

Dernière modification: J'ai essayé d'utiliser une SqlConnection normale au lieu d'un "thingies as New ThingiesDataContext" et le problème persiste.

Il semble que TransactionScope ne peut pas gérer plusieurs connexions SQL à l'intérieur d'une même transaction.

Microsoft officiel Note

parallel transactions are not supported by SQL Server.

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

+0

Y a-t-il une autre transaction qui ouvre l'autre table? Est-ce une transaction imbriquée? –

+0

non; non.

Répondre

1

Ce n'est pas un problème MSDTC. Si c'était le cas, vous obtiendriez une erreur indiquant que DTC n'est pas activé et doit l'être. Ce n'est pas non plus un problème d'impasse, car vous auriez aussi une erreur spécifique à ce sujet.

Si je devais deviner, je dirais que le 'Autre code compliqué ...' tente d'effectuer une opération de base de données et est bloqué par l'un ou l'autre des objets de contexte de base de données. Une manière de déterminer cela est d'exécuter SQL Profiler pour voir quelles instructions SQL sont réellement exécutées sur le serveur et vérifier les blocs.

+0

En fait, il s'avère que la ligne de LINQ est à l'origine du problème. Plus de détails sont dans mon post édité. –