2017-08-28 3 views
-1

J'ai plusieurs services utilisant la même table et je veux verrouiller la table en utilisant EF, si un service l'utilise déjà.EF peut-il verrouiller la table?

J'essaie de le faire avec l'aide de la solution ci-dessous, mais il ne fonctionne pas

How can I lock a table on read, using Entity Framework?

Pour plus d'informations

J'essaie d'utiliser ce code de « Service 1 » au en même temps, j'ai utiliser "Service 2" appeler même fonction, mais il récupère encore des données de la table.

** Je veux que la fonction d'appel "Service 1" puis la table soit verrouillée et que "Service 2" ne puisse pas récupérer de données ou faire quoi que ce soit est-ce possible?

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.RepeatableRead })) 
{ 
     var newUrl = dbEntity.URLs.FirstOrDefault(url => url.StatusID == (int) URLStatus.New); 
     if(newUrl != null) 
     { 
      newUrl.StatusID = (int) URLStatus.InProcess; 
      dbEntity.SaveChanges(); 
     } 

     scope.Complete(); 
} 
+1

questions visant à obtenir l'aide de débogage (« pourquoi pas ce code fonctionne? ») Doit comprendre le comportement souhaité, un problème spécifique ou d'une erreur et le code le plus court nécessaire pour le reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un exemple minimal, complet et vérifiable. – TheGameiswar

+0

merci. Je vais ajouter plus d'informations. – Witchayanin

Répondre

0

Aucun niveau d'isolation de transaction ne le fait. La façon la plus simple de le faire est avec un Application Lock. Un verrou d'application est comme un Mutex global qui peut permettre à un seul ordinateur client d'exécuter un morceau de code. Notez que ce code ne doit pas nécessairement être un code de base de données. Vous pouvez utiliser un verrou d'application pour accorder à un client un accès exclusif à un fichier ou à une autre ressource.

Comme ceci:

par exemple

using (var tran = db.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted)) 
{ 
    var lockName = "MyLock"; 
    db.Database.ExecuteSqlCommand($"exec sp_getapplock '{lockName}', 'exclusive'"); 

    // do stuff 

    tran.Commit(); 
}