2009-03-04 5 views
3

J'utilise TransactionScope s à un niveau élevé pour envelopper du code de haut niveau qui fait un certain nombre de connexions à la base de données.Comment spécifier le niveau d'isolation de base de données à utiliser, à un niveau élevé?

L'une des fonctions que j'appelle est une lecture générique qui est utilisée pour les fonctions en lecture seule où un niveau d'isolement read uncommitted est nécessaire. Mais dans certains cas, il est utilisé dans le cadre d'une grande opération de mise à jour et un read committed serait plus approprié.

Au niveau le plus élevé où j'appelle mes fonctions à l'intérieur d'une étendue de transaction, devrais-je pouvoir définir le niveau d'isolement pour la transaction?

Répondre

4

Vous pouvez définir le niveau d'isolement sur le TransactionScope lui-même. C'est ce que tu veux dire?

using (var txn = new TransactionScope(
    TransactionScopeOption.Required, 
    new TransactionOptions 
    { 
     IsolationLevel = IsolationLevel.ReadUncommitted 
    } 
)) 
{ 
    // Your LINQ to SQL query goes here 
} 

(code volé mon blog here.)

+0

Merci, je ne sais pas comment j'ai raté. – tpower

1

Vous pouvez définir le niveau d'isolation des transactions tant au niveau de la connexion et le niveau déclaration/transaction. Si je comprends votre scénario correctement, je considérerais ajuster le niveau d'isolation de transaction avant votre requête de mise à jour spécifique seulement, si la majorité de l'autre activité dans la connexion donnée va être l'activité de lecture seule. Gardez à l'esprit que le niveau d'isolation par défaut pour SQL Server est Read Committed, donc si vous définissez un niveau d'isolation différent au niveau de la connexion, vous devrez passer à Read Commited au niveau transaction/instruction avant votre mise à jour. .

Une chose à considérer est bien sûr de laisser le niveau d'isolement par défaut tel quel. Y a-t-il une raison spécifique pour laquelle vous pensez que Read Committed n'est pas approprié pour votre activité de lecture générique?

Avez-vous du sens? Faites-moi savoir si vous avez besoin de plus de précisions.

Cheers, John

Mise à jour Basé sur les commentaires. Assez juste, si vous développez une base de données OLTP haut de gamme, vous voudrez peut-être regarder une technologie/principe SQL Server appelé versioning de la ligne. Cela vous permettra d'effectuer des lectures d'une version d'un enregistrement pour ainsi dire. Il y a des frais généraux sur le tempdb lorsque vous utilisez de telles techniques, mais si vous utilisez suffisamment de matériel, cela peut être approprié. Le livre blanc suivant est un excellent guide pour SQL Server Row Versioning/Snapshot Isolation

http://msdn.microsoft.com/en-us/library/ms345124.aspx

+2

La lecture validée bloque sur moi alors qu'une grande opération d'insertion/suppression est en cours. – tpower

Questions connexes