【问题标题】:implementing redis script rollback on error实现redis脚本错误回滚
【发布时间】:2021-02-22 23:17:04
【问题描述】:

如果 redis lua 脚本中途失败,有没有办法回滚更改?

即通过 EVAL 调用它,当前代码将给键加一然后抛出

local function inc2 (key)
  redis.call('INCRBY',key,1)
  error("FAIL")
  redis.call('INCRBY',key,1)
end

return inc2(KEYS[1])

我希望能够有办法回滚第一个 INCRBY,以便它在出错时不执行任何操作。

有没有办法做到这一点?

【问题讨论】:

  • 没有。没有办法回滚。
  • @for_stack 我很乐意接受你的回答

标签: redis lua


【解决方案1】:

将您的第一次增量尝试包装在 pcall()

local function inc2( key )
    local success, msg = pcall( redis.call( 'INCR', key ) )

    if success then
        redis.call( 'INCR', key )
    else
        error( msg )
        redis.call( 'DECR', key )
    end
end

inc2( KEYS[1] )

在我看来,检查值是否在开始范围内会更有效。

local function inc2( key, max )
    if redis.call( 'get', key ) < max then
        redis.call( 'INCRBY', key, 2 )
    end
end

inc2( KEYS[1], 20 )

【讨论】:

  • 不完全确定为什么要使用它,因为如果失败它不应该增加,对吧?也许它因其他原因而失败,事后,超出范围或其他原因......好吧,无论如何,这就是如何做到的。
  • 谢谢!我主要是问,因为我一直读到 redis eval 操作是原子的,并且似乎当脚本中途出错时,数据库可以处于部分状态。我想弄清楚是否有办法解决它,但现在看来,不处于部分状态的唯一方法就是不要在脚本本身中出错。
猜你喜欢
  • 2017-01-27
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
相关资源
最近更新 更多