Причината WATCH
не е изложен директно е поради начина, по който SE.Redis е проектиран да мултиплексира команди от различни стекове от повиквания в една връзка. Това прави необходимо всяка транзакция да бъде много строго управляван.
Не ми е ясно каква би била целта на „непроменено“ само по себе си , без сравнение с някаква известна стойност - в противен случай просто създавате условие за състезание. Определено би било възможно да се добави поддръжка за него, но наистина бих искал първо да разбера очаквания случай на употреба. Можеш ли да обясниш?
Повторете вашата редакция; предпочитаният от вас пример (последният) просто не е възможен с redis - нищо общо с SE.Redis; ако направите GET
вътре в MULTI
, не получавате отговора до EXEC
завършва - така че е възможно да не можете да използвате стойността в SET
:все още не е наличен .
Ако не беше за мултиплексиране, бихте могли да пренаредите малко втория си пример (въз основа на това, което прави SE.Redis):
WATCH key
val = GET key
MULTI
val = val + 1
SET key $val
EXEC
това е типичното използване на WATCH
:вие гледате нещата, които задавате предварително, тогава знаете, че {key}
е непроменен по време на този цикъл (или поне транзакцията ще бъде прекъсната; няма непоследователно състояние). Въпреки това, WATCH
не работи добре с мултиплексор , поради което SE.Redis ви принуждава надолу по пътя на извличане на стойността преди транзакцията , след което ви позволява да сравните стойността, за да потвърдите, че тя е непроменена. Същият резултат; малко по-различен подход, но е безопасен за мултиплексор. За повече информация по тази тема вижте тук.