Ich habe mehrere Fragen über die Verwendung von Transaktionen aus StackExchange.Redis:
{1}
hashtag und der Schlüssel des zweiten Befehls hat {2}
hashtag. 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? 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.
Ich habe ein bisschen in den StackExchange.Redis Quellcode gegraben und mit dem Treiber gespielt, hier sind meine Beobachtungen:
ITransaction
instance Execute()
/ ExecuteAsync()
aufrufen
Die Antworten scheinen folgende zu sein:
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). 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).
Sie können keine Multitasten-Operationen mit Multi-Cluster-Schlüsseln senden.
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). " Ссылка
Tags und Links .net c# redis stackexchange.redis redis-cluster