我有几个关于使用StackExchange.Redis的交易的问题:
{1}
个主题标签,第二个命令的密钥有{2}
个主题标签。Execute()
/ ExecuteAsync()
何时返回false
?只有在没有达到设定的条件时?如果没有设置条件,它可以返回false
吗?Execute()
/ ExecuteAsync()
会抛出或只返回false
吗?我是否还要检查命令的任务(假设命令完全正确并且通常不会抛出)或者它们将被取消?不幸的是the doc没有详细解释#2和#3。
答案 0 :(得分:5)
我已经挖掘了一下StackExchange.Redis的源代码并与驱动程序一起玩,以下是我的观察:
ITransaction
实例Execute()
/ ExecuteAsync()
答案似乎如下:
Execute()
/ ExecuteAsync()
在两种情况下返回false
:由于条件未满足而导致事务被丢弃,以及驱动程序无法对命令进行排队(例如,由于服务器OOM) 。所有命令任务都将标记为已取消。如果其中一个命令在执行期间失败(例如,由于错误的类型操作),Execute()
/ ExecuteAsync()
也不会返回false
。Execute()
/ ExecuteAsync()
将抛出异常并且所有命令任务将保持在"等待激活"状态。总而言之,只有Execute()
/ ExecuteAsync()
返回true
时才会检查命令任务:每个任务都会包含结果或错误(请参阅Exception
属性)。
答案 1 :(得分:1)
您无法使用多群集密钥发送多键操作。
命令可能无法排队,因此在调用EXEC之前可能会出错。例如,命令可能在语法错误(错误的参数数量,错误的命令名称,......),或者可能存在某些严重情况,如内存不足情况(如果服务器配置为使用maxmemory具有内存限制指令)。
在调用EXEC之后,命令可能会失败,例如,因为我们对具有错误值的键执行了操作(比如对字符串值调用列表操作)。 https://redis.io/topics/transactions