2

J'utilise l'instruction de sélection LINQ enveloppée dans un TransactionScope (pour changer le verrouillage) mais selon SQL Profiler, cela ne semble pas fonctionner. Mon code ressemble:LINQ et TranscationScope ne fonctionnent pas

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

Maintenant, j'attendre SQL Profiler pour montrer BatchStarting et BatchComplete pour mon instruction select. Mais cela montre RPC: Terminé. Pourquoi? quand je cours ce code:

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 
     } 
    } 

Il montre BatchStarting et BatchComplete. Pourquoi LINQ ne semble-t-il pas "voir" le TransactionScope?

Existe-t-il un moyen de confirmer que mon niveau d'isolation est correct avec Profiler? Je ne peux voir que le niveau d'isolement de la connexion initiale via Audit Login. Aucune "mise à jour" n'est affichée pour montrer qu'elle a été modifiée ou ce que chaque niveau d'isolation utilise pour chaque requête.

Toute aide serait formidable!

En outre, ce code est en cours d'exécution dans un WCF (3.5) Service connexion à SQL Server 2008

+0

Pourquoi utilisez-vous l'étendue de la transaction pour interroger? – garik

+0

Rechercher SET TRANSACTION ISOLATION LEVEL – garik

+0

J'utilise transactionscope pour changer le type de verrouillage. Je fais l'equiv à nolock sélectionnez l'instruction. J'utilise linq parce que je suis en train de faire une instruction select et de la masser en xml dans la même ligne. (XElement) – BabelFish

Répondre

1

MISE À JOUR:

Essayez quelque chose comme ceci pour vérifier le niveau d'isolement:

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)); 
    } 
} 

AJOUTS:

Rechercher SET TRANSACTION ISOLATION LEVEL

+0

commutation de l'ordre (instancier db puis transcope) encore montre RPC: Terminé :( – BabelFish

+0

merci .. apparaît que transcope fonctionne .. le profileur doit afficher les instructions SP car linq exécute le SQL via sq_executesql et affiche les instructions TM pour afficher les transactions en cours. le niveau d'isolement est correct textsize. -1 langue: us_english dateformat: mdy datefirst: 7 lock_timeout: -1 quoted_identifier: SET ANSI_NULL_DFLT_ON: SET ANSI_WARNINGS: SET ansi_padding: SET ansi_nulls: SET concat_null_yields_null: SET niveau d'isolation: lu non lié – BabelFish

+0

Ceci conduit à mes questions suivantes. Cette instruction select est bloquée par une autre transaction utilisant readcommited. pourquoi cette déclaration select serait-elle bloquée?les deux appels traitent des mêmes tables mais des lignes différentes. les deux appels ont de grandes clauses where si cela fait une différence. – BabelFish

Questions connexes