看一下rediscala的实现,您似乎不能使用我在原始答案中建议的乐观锁(见下文),因为在rediscala中
TransactionBuilder
不会发送
WATCH
命令直到
EXEC
令它变得毫无用处的命令。有一个旧的关闭
bug on GitHub
指的是另一个
SO question
在这种情况下,答案是
在rediscala中,您无法读取事务内部的内容,因为您将阻止客户端执行其他请求。
我建议你试试看你是否能签入lua脚本。(在lua脚本中转换事务)
几个月后
它关闭是因为
不建议实施
你应该用
http://redis.io/commands#scripting
从2014年开始,情况似乎是一样的,我认为不会改变。
原始答案
我没有活生生的redis来测试它,但是看看
Redis transaction docs
看起来redis不像您想象的那样支持sql风格的事务。它支持原子操作,但不能执行“启动事务获取数据检查可能修改提交”循环。所有“获取数据”命令都将在
执行官
命令到了。这意味着您不能在同一事务中的get和set之间进行任何检查。
如果你看
使用检查和设置的乐观锁定
“在文档中,您可以看到实现您的行为的正确方法是:
-
创建事务
watch
为了钥匙
-
获取值
外部
交易的
-
检查该值,如果需要更新,则在事务内部发出更新。(别忘了
UNWATCH
如果不需要更新)
-
执行交易
-
检查事务是否失败,如果失败,则重复整个周期。如果没有-你是写价值的赢家。