为了账号安全,请及时绑定邮箱和手机立即绑定

Understand Redis Transaction

Understand Redis Transaction

慕尼黑8549860 2019-07-06 23:13:33
疑点如下伪代码中//其中con客户端redis链接,key1,key2分别是两个键funchandler(con,key1,key2){con.mutl()con.set(key1,value1)//我的疑问是在这里:当本事务执行的过程中,也就是被redis-server执行的过程中,//key2的值没有没有可能被改变?在什么情况下才会变?谢谢您的回答con.exec()}MUTL/EXEC执行事务中redis是不是还可以同时改变其他的键值?概念理解redis事务的作用:1.保证被事务包含的命令要么全部执行,要么全部不执行(注意:在执行事务的过程中遇到错误可能会导致有些命令不能执行).2.保证被事务包含的命令执行时不被打断.对于第二点来说,于任何客户端来说启用多线程来执行被事务包含的代码没多大效果;因为redis是一个进程(没有多线程),也就是说执行体只有一个;同时又因为事务的存在,同一时刻只有一个事务在执行(事务包含命令没有并行执行),所以说客户端通过多线程方式执行被redis事务包含的命令作用不大;同时也说明被事务包含的代码可以防止资源的竞争.伪代码说明fori=0;i
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

redis事务其实就是按顺序打包运行命令,所以你上面第一条是不成立的,中间有指令失败,还是会执行前面的指令,所以没有回滚,也不存在要么全部不执行。第二点是成立的,在事务执行过程中,其他命令是阻塞状态,等待事务指令全部完成才继续。
                            
查看完整回答
反对 回复 2019-07-06
?
千万里不及你

TA贡献1784条经验 获得超9个赞

讲一下我的理解:redis有事物,但无原子性multi初始化了一个命令队列,使该事物的命令以线性存储,在redis中,对于一个存在问题的命令,如果在入队的时候就已经出错,整个事务内的命令将都不会被执行(其后续的命令依然可以入队),如果这个错误命令在入队的时候并没有报错,而是在执行的时候出错了,那么redis默认跳过这个命令执行后续命令。也就是说,redis只实现了部分事务;一般认为在传统的关系型数据中,只要有任意一条指令失败,则整个事务都会被rollback,而在redis的事物中,中间的某条指令的失败不会导致前面已做指令rollback,也不会造成后续的指令不做。
                            
查看完整回答
反对 回复 2019-07-06
  • 2 回答
  • 0 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信