Årsagen til WATCH
ikke eksponeres direkte er på grund af, hvordan SE.Redis er designet til at multiplekse kommandoer fra forskellige opkaldsstakke på en enkelt forbindelse. Dette gør det nødvendigt for ethvert transaktionsarbejde at være meget stramt styret.
Jeg ved ikke helt, hvad formålet med "uændret" ville være af sig selv , uden sammenligning med en eller anden kendt værdi - ellers opretter du bare en racetilstand. Det ville helt sikkert være muligt at tilføje support til det, men jeg vil virkelig gerne forstå den forventede use-case først. Kan du forklare?
Re din redigering; dit foretrukne eksempel (det sidste) er simpelthen ikke muligt med redis - intet at gøre med SE.Redis; hvis du laver en GET
inde i en MULTI
, får du ikke svaret før EXEC
fuldfører - så du kan umuligt bruge værdien i SET
:den er ikke tilgængelig endnu .
Hvis det ikke var for multipleksing, kunne du omarrangere dit andet eksempel (baseret på hvad SE.Redis gør) lidt:
WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC
dette er det typiske brug af WATCH
:du ser de ting, du forespørger på på forhånd, så ved du, at {key}
er uændret under denne løkke (eller i det mindste vil transaktionen være afbrudt; ingen inkonsistent tilstand). Dog WATCH
spiller ikke godt med en multiplekser , hvilket er grunden til, at SE.Redis tvinger dig ned på ruten for at hente værdien før transaktionen , så du kan sammenligne værdien for at hævde, at den er uændret. Samme resultat; lidt anderledes tilgang, men den er multiplekser-sikker. For mere om det emne se her.