2 Stimmen

LINQ und TranscationScope funktionieren nicht

Ich verwende LINQ select-Anweisung in einem TransactionScope (um die Sperrung zu ändern), aber laut SQL Profiler, es scheint nicht zu funktionieren. Mein Code sieht wie folgt aus:

using (var ts = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted} ))
{
   using (myDBDataContext dbPKC = new myDBDataContext(conn))
   {
      ...query...
      ts.Complete();
      return xmlMachine;
   }
}

Jetzt würde ich erwarten, dass SQL Profiler BatchStarting und BatchComplete für meine Select-Anweisung anzeigt. Es wird jedoch RPC:Completed angezeigt. Warum? wenn ich diesen Code ausführe:

using (SqlConnection conn1 = new SqlConnection())
    {
      conn1.ConnectionString = WebConfigurationManager.ConnectionStrings["myConnectionString"].ToString(); ;
      conn1.Open();
      using (SqlTransaction trans1 = conn1.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted))
      {
        SqlCommand cmd = new SqlCommand("select * from Machines where pkID = 5");
        cmd.Connection = conn1;
        cmd.Transaction = trans1;
        SqlDataReader reader = cmd.ExecuteReader(); // just execute something
      }
    }

Es zeigt BatchStarting und BatchComplete an. Warum scheint LINQ den TransactionScope nicht zu "sehen"?

Gibt es auch eine Möglichkeit zu bestätigen, dass meine Isolationsebene durch Profiler korrekt ist? Ich kann den Isolierungsgrad der ursprünglichen Verbindung nur über Audit Login sehen. Es wird keine "Aktualisierung" angezeigt, um zu zeigen, dass sie geändert wurde oder welche Isolationsebene die einzelnen Abfragen verwenden.

Jede Hilfe wäre wunderbar!

Außerdem wird dieser Code in einem WCF (3.5)-Dienst ausgeführt, der mit SQL Server 2008 verbunden ist

1voto

garik Punkte 5544

AKTUALISIERT:

Versuchen Sie so etwas, um den Isolationsgrad zu überprüfen:

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, options))
{
    //Verify Scope using DBCC USEROPTIONS
    SqlCommand cmd = (SqlCommand)ctxt.Connection.CreateCommand();
    cmd.CommandText = "DBCC USEROPTIONS";
    SqlDataReader r = cmd.ExecuteReader();
    while (r.Read())
    {
        Console.WriteLine(r.GetValue(0) + ":" + r.GetValue(1));
    }
}   

HINZUFÜGEN:

Suche nach SET TRANSACTION ISOLATION LEVEL

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X