multi exec watch

Redis 事务

生来就可爱ヽ(ⅴ<●) 提交于 2020-04-09 11:15:50
先手动执行如下命令,然后看看效果 >multi >set str1 "hello world" >"QUEUED" >set str2 hello world >"QUEUED" >set str2 "welcome" >"QUEUED" >exec > 1) "OK" > 2) "ERR syntax error" > 3) "OK" >get str1 >"hello world" >get str2 >null >get str3 >welcome 1)事务以 multi 开始 exec 结束,在exec执行之前的命令,都会存储在Redis服务端的命令队列里面直到exec调用才会执行,因此,任何multi与exec之间的命令都不会及时反馈结果。因此我们无法在事务里面通过读取Redis数据来做决定,这就说明你只能是在multi之前把需要从Redis获取的数据读取出来,然后在到事务里面去做决定,哈哈,这是不是太蠢了,因为这是脏读。 2)从示例结果你可以看出,事务在set str2 发生语法错误,可是整个结果却没有保证数据的原子性(要么成功,要么失败),因为 str1插入成功,str3插入成功,str2插入失败。这说明Redis服务端执行队列里的命令时遇到错误不会回滚也不会停止运行,Redis是这样设计的,理由是回滚是多余的操作,因为错误都是程序员代码造成的