Understand Redis Transaction

发布于 2022-09-11 20:41:50 字数 965 浏览 32 评论 0

疑点

如下伪代码中

//其中 con 客户端redis链接,key1,key2分别是两个键 
func handler(con,key1,key2) {
    con.mutl()
    con.set(key1,value1)
    // 我的疑问是在这里: 当本事务执行的过程中,也就是被redis-server 执行的过程中,
    //  key2 的值没有没有可能被改变? 在什么情况下才会变? 谢谢您的回答
    con.exec()
}

MUTL/EXEC 执行事务中 redis 是不是还可以同时改变其他的键值?

概念理解

redis 事务的作用:
1.保证被事务包含的命令要么全部执行,要么全部不执行(注意:在执行事务的过程中遇到错误可能会导致有些命令不能执行).
2.保证被事务包含的命令执行时不被打断.

对于第二点来说,于任何客户端来说启用多线程来执行被事务包含的代码没多大效果;因为
redis是一个进程(没有多线程),也就是说执行体只有一个;同时又因为事务的存在,同一时刻只有一个事务在执行(事务包含命令没有并行执行),所以说客户端通过多线程方式执行被redis事务包含的命令作用不大;同时也说明被事务包含的代码可以防止资源的竞争.

伪代码说明

for i = 0 ; i < 3 ; i++ {

 //启用新的线程执行 命令
newThread.doTaskBackground(doTransTask);

}

doTransTask() {

MULTI;//事务开始
// other commands
set key1  value1 //因为事务执行过程不被打断,对于key1的设置不存在竞争
EXEC; //事务结束

}

以上是自己的理解,有错误的地方还请指出. 如果您有什么心得也可以告知与我.谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浪荡不羁 2022-09-18 20:41:50

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

月牙弯弯 2022-09-18 20:41:50

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文