StackExchange.Redis: einige Fragen zu Transaktionen

8

Ich habe mehrere Fragen über die Verwendung von Transaktionen aus StackExchange.Redis:

  1. Ist es erlaubt, Befehle in einer Transaktion auszuführen, die möglicherweise auf verschiedene Knoten in der Cluster-Umgebung abzielen? Angenommen, der Schlüssel des ersten Befehls hat {1} hashtag und der Schlüssel des zweiten Befehls hat {2} hashtag.
  2. Wann gibt die Transaktion Execute() / ExecuteAsync() false zurück? Nur wenn die festgelegten Bedingungen nicht erfüllt wurden? Könnte es false zurückgeben, wenn keine Bedingungen festgelegt wurden?
  3. Wenn ein Netzwerk- oder interner Redis-Fehler auftritt, wird Execute() / ExecuteAsync() werfen oder einfach false zurückgeben? Sollte ich auch die Aufgaben der Befehle überprüfen (unter der Annahme, dass Befehle vollständig korrekt sind und normalerweise nicht geworfen werden sollen) oder werden sie einfach abgebrochen?

Leider erklärt das Dokument nicht # 2 und # 3 in Details.

    
andreycha 09.02.2018, 17:34
quelle

2 Antworten

4

Ich habe ein bisschen in den StackExchange.Redis Quellcode gegraben und mit dem Treiber gespielt, hier sind meine Beobachtungen:

  • Beim Aufruf von Op-Methoden auf ITransaction instance
  • findet keine tatsächliche Interaktion statt
  • Treiber beginnt mit Redis nur zu sprechen, wenn Sie Execute() / ExecuteAsync() aufrufen

Die Antworten scheinen folgende zu sein:

  1. Wie von @ royimindel erwähnt, müssen alle Schlüssel in der Transaktion auf denselben Slot zielen. Andernfalls erhalten Sie die Ausnahme "Mehrfachschlüsseloperationen müssen einen einzelnen Slot einschließen".
  2. Execute() / ExecuteAsync() gibt false in zwei Fällen zurück: wenn die Transaktion verworfen wurde, weil die Bedingungen nicht erfüllt waren, und wenn der Treiber den Befehl nicht einreihen konnte (z. B. wegen Server-OOM). Alle Befehlsaufgaben werden als abgebrochen markiert. Auch Execute() / ExecuteAsync() nicht gibt false zurück, wenn einer der Befehle während der Ausführung fehlgeschlagen ist (z. B. wegen falscher Typoperation).
  3. Falls ein Netzwerkproblem auftritt, wird Execute() / ExecuteAsync() eine Ausnahme auslösen und alle Befehle werden im Zustand "Warten auf Aktivierung" bleiben.

Um es zusammenzufassen, sollten Befehlsaufgaben nur überprüft werden, wenn Execute() / ExecuteAsync() zurückgegebene true : jede Aufgabe enthält entweder ein Ergebnis oder einen Fehler (siehe Exception Eigenschaft).

    
andreycha 12.02.2018, 13:42
quelle
1
  1. "Redis Cluster implementiert alle einzelnen Tastenbefehle, die in der nicht-verteilten Version von Redis verfügbar sind. Befehle, die komplexe Multitastenoperationen ausführen, wie zum Beispiel Vereinigungen oder Schnittpunkte vom Typ Satz, werden implementiert, solange die Schlüssel alle zum selben Knoten gehören . " Ссылка

Sie können keine Multitasten-Operationen mit Multi-Cluster-Schlüsseln senden.

  1. "Während einer Transaktion können zwei Arten von Befehlsfehlern auftreten:

Ein Befehl kann möglicherweise nicht in die Warteschlange gestellt werden, daher kann ein Fehler auftreten, bevor EXEC aufgerufen wird. Zum Beispiel kann der Befehl syntaktisch falsch sein (falsche Anzahl von Argumenten, falscher Befehlsname, ...), oder es kann kritische Zustände geben, wie eine Speichermangelbedingung (wenn der Server ein Speicherlimit unter Verwendung des maxmemory hat Richtlinie).

Ein Befehl kann fehlschlagen, nachdem EXEC aufgerufen wurde, zum Beispiel weil wir eine Operation gegen einen Schlüssel mit dem falschen Wert ausgeführt haben (wie das Aufrufen einer Listenoperation gegen einen Zeichenfolgenwert). " Ссылка

  1. In .Net, wenn Sie eine Aufgabe ausführen, wenn eine unbehandelte Ausnahme in geworfen wird - es wird nicht außerhalb der Aufgabe Blase, wenn Sie taskInstance.Wait () verwenden - dann erhalten Sie eine AggregateException und müssen InnerExceptions für die überprüfen tatsächliche Ausnahmen.
Royi Mindel 12.02.2018 09:55
quelle