2012-02-21 5 views
3

Je suis un peu nouveau chez Redis et je suis en train de l'évaluer. J'utilise le serveur Redis d'ici: https://github.com/downloads/dmajkic/redis/redis-2.4.5-win32-win64.zipClient Redis/ServiceStack Transactions exception

Je suis également en utilisant la configuration suivante pour le serveur:

Port 6379 délai d'attente de 300 sauver 900 1 sauver 300 10 sauver 60 10000 LogLevel debug logfile stdout bases de données 1 MaxClients 32 MaxMemory 2147483648

Je suis en train d'exécuter du code comme ce client l'utilisation de ServiceStack (ServiceStack-ServiceStack.Redis-4add28 a)

Voici mon code

public void InsertInsideTransaction(bool shouldTransactionRollback) 
{ 
    RedisClient transClient = new RedisClient("localhost"); 

    ClearAll(); 
    using (var trans = transClient.CreateTransaction()) 
    { 
     trans.QueueCommand(r => 
      { 
       var redisUsers = r.GetTypedClient<User>(); 
       var sacha = new User { Id = redisUsers.GetNextSequence(), Name = "Sacha Barber" }; 
       redisUsers.Store(sacha); 
       //redisUsers.Dispose(); 
      }); 

     //commit or rollback based on incoming flag 
     if (shouldTransactionRollback) 
      trans.Rollback(); 
     else 
      trans.Commit(); 

     IList<User> users = Users(); 
     Console.WriteLine(string.Format("InsertInsideTransaction : There are currently {0}, Users", users.Count())); 
    } 




} 

Où l'utilisateur ressemble à ceci (d'un des exemples qui vient avec ServiceStack)

public class User 
{ 
    public User() 
    { 
     this.BlogIds = new List<long>(); 
    } 

    public long Id { get; set; } 
    public string Name { get; set; } 
    public List<long> BlogIds { get; set; } 
} 

que je reçois cette exception quand je tente de commettre les transaction

réponse inconnue sur plusieurs demande: 43QUEUED, sPort: 60793, LastCommand: EXEC

à ServiceStack.Redis.RedisNativeClient.CreateResponseError (erreur de chaîne) dans C: \ Utilisateurs \ barbers \ Bureau \ Téléchargements \ ServiceStack-ServiceStack.Redis-4add28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack.Redis \ RedisNativeClient_Utils. cs: ligne 146 à ServiceStack.Redis.RedisNativeClient.ReadMultiDataResultCount() dans C: \ Utilisateurs \ barbers \ Bureau \ Téléchargements \ ServiceStack-ServiceStack.Redis-4add28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack.Redis \ RedisNativeClient_Utils .cs: ​​ligne 578 à ServiceStack.Redis.Pipeline.QueuedRedisOperation.ProcessResult() dans C: \ Utilisateurs \ barbers \ Bureau \ Téléchargements \ ServiceStack-ServiceStack.Redis-4add28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack. Redis \ Pipeline \ QueuedRedisOperation.cs: ligne 169 à ServiceStack.Redis.RedisTransaction.Commit() dans C: \ Utilisateurs \ barbers \ Desktop \ Downloads \ ServiceStack-ServiceStack.Redis-4add 28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack.Redis \ Transaction \ RedisTransaction.cs: ligne 100 à DocumentDB.Redis.RedisMessAround.InsertInsideTransaction (Boolean shouldTransactionRollback) dans C: \ Users \ barbers \ Desktop \ DocumentDBs \ DocumentDB .Redis \ RedisMessAround.cs: ligne 63 à DocumentDB.Redis.Program.Run() dans C: \ Users \ barbers \ Bureau \ DocumentDBs \ DocumentDB.Redis \ Program.cs: ligne 45 dans DocumentDB.Redis.Program. Main (String [] args) dans C: \ Utilisateurs \ barbers \ Bureau \ DocumentDBs \ DocumentDB.Redis \ Program.cs: ligne 18 à System.AppDomain._nExecuteAssembly (RuntimeAssembly assembly, String [] args) at System.AppDomain .ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at Syste m.Threading.ThreadHelper.ThreadStart_Context (état de l'objet) à System.Threading.ExecutionContext.Run (ExecutionContext executionContext, rappel ContextCallback, état Object, Boolean ignoreSyncCtx) à System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback callback, Object état) à System.Threading.ThreadHelper.ThreadStart()

J'ai alors pensé Ok les gars Redis ServiceStack ont ​​ce travail en utilisant les transactions dans leurs tests unitaires, donc j'édité les « RedisTransactionTests » que le client est venu avec ServiceStack (ServiceStack -ServiceStack.Redis-4add28a) J'utilise

Voici ce que j'ajouté aux "RedisTransactionTests"

public class User 
{ 
    public User() 
    { 
     this.BlogIds = new List<long>(); 
    } 

    public long Id { get; set; } 
    public string Name { get; set; } 
    public List<long> BlogIds { get; set; } 
} 

où j'ai ce code de test édité

[Test] 
[TestCase(true)] 
[TestCase(false)] 
public void TestUserTrans(bool shouldTransactionRollback) 
{ 
    int count = 0; 


    IRedisTransaction trans = Redis.CreateTransaction(); 

    try 
    { 
     trans.QueueCommand(r => 
     { 
      var redisUsers = r.GetTypedClient<User>(); 
      var sacha = new User { Id = redisUsers.GetNextSequence(), Name = "Sacha Barber" }; 
      redisUsers.Store(sacha); 
     }); 

     //commit or rollback based on incoming flag 
     if (shouldTransactionRollback) 
      trans.Rollback(); 
     else 
      trans.Commit(); 
    } 
    catch (Exception ex) 
    { 

    } 

    IList<User> users = Users(); 
    count = users.Count(); 
    Console.WriteLine(string.Format("TestUserTrans : There are currently {0}, Users", users.Count())); 
    if (shouldTransactionRollback) 
     Assert.That(count == 0); 
    else 
     Assert.That(count == 1); 

} 

Là-dedans l'exception semble avoir complètement avalé.

Que diable suis-je tort

Répondre

4

Vous ne pouvez pas lire et utiliser les résultats dans les mêmes transactions.

Assurez-vous de lire sur la façon dont fonctionne MULTI/EXEC: http://redis.io/topics/transactions

Il fonctionne efficacement par plusieurs commandes en Batching en une seule commande composé qui est envoyé et traité par Redis en 1 Go.

Dans votre exemple, vous essayez d'effectuer une lecture avec redisUsers.GetNextSequence() et d'utiliser le résultat de la transaction en file d'attente. Vous ne pouvez pas le faire, au lieu si vous voulez utiliser des variables dans vos transactions en attente, vous devez le lire avant:

var sacha = new User { 
    Id = Redis.As<User>().GetNextSequence(), Name = "Sacha Barber" }; 

trans.QueueCommand(r => r.As<User>().Store(sacha)); 

Note: .As<T>() est un raccourci pour r.GetTypedClient<T>()

Pour transaction intégrité sur les lectures, vous pouvez émettre la commande WATCH pour spécifier toutes les variables que votre transaction utilisera. Ensuite, si l'une de ces variables est modifiée avant la fin de la transaction, une exception sera déclenchée et aucune des opérations en file d'attente ne sera exécutée.

+0

Ah génial, je vous ai dit que j'étais un débutant. Cela m'a réglé, je m'assurerai de lire les liens que vous avez publiés. Merci beaucoup – sacha

Questions connexes