Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于Redis事务不是原子性问题 #452

Closed
WeaveOne opened this issue Aug 24, 2019 · 10 comments
Closed

关于Redis事务不是原子性问题 #452

WeaveOne opened this issue Aug 24, 2019 · 10 comments
Labels
enhancement New feature or request or suggestion

Comments

@WeaveOne
Copy link

WeaveOne commented Aug 24, 2019

redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

@Snailclimb
Copy link
Owner

Snailclimb commented Sep 2, 2019

redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

好的 感谢补充。我已经同步:https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/Redis/Redis.md#redis-%E4%BA%8B%E5%8A%A1

@Snailclimb Snailclimb added the enhancement New feature or request or suggestion label Sep 2, 2019
@fangjunpang
Copy link

不一定吧 -> https://blog.csdn.net/yangshangwei/article/details/82866216

@WeaveOne
Copy link
Author

WeaveOne commented Oct 9, 2019

不一定吧 -> https://blog.csdn.net/yangshangwei/article/details/82866216
我们讨论的是redis事务不是原子性问题,你这个是命令都错了。

@allenshao9
Copy link

1.若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行
2.若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。

@JasonLaw1994
Copy link

我觉得Redis官方文档所说的没什么问题。

Either all of the commands or none are processed, so a Redis transaction is also atomic.

只不过它不支持roll back罢了,但是这不影响事务是atomic的。

@harrymelon
Copy link

如果不能保持原子性,那使用事务的意义是什么呢?
我们不就是为了让他全部执行、或者全部不执行嘛?
我不是很理解这个点。

@biggerboy
Copy link

biggerboy commented Sep 13, 2022

根据原子性的定义(事务的原子性确保动作要么全部完成,要么完全不起作用)来看,Redis的事务是不支持原子性的,因为存在部分成功部分失败的情况,所以Redis的事务和传统意义上的事务是不一样的,或者说严格意义上不能称之为事务

如果不能保持原子性,那使用事务的意义是什么呢? 我们不就是为了让他全部执行、或者全部不执行嘛? 我不是很理解这个点。

@wuhunyu
Copy link

wuhunyu commented Sep 23, 2022

维基百科是这么描述ACID

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行
持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中

redis说原子性是一组命令要么全部执行,要么全部不执行,倒是满足原子性的。但一致性是不满足的呀,一旦出现某一个命令执行失败了,其他的命令却还是正常执行,这就不能算是从一个合理的状态变换到另一个合理状态了

@Pa1etteZ
Copy link

Pa1etteZ commented May 10, 2024

原子性有两个概念:在数据库中,事务的ACID中原子性指的是"要么都执行要么都回滚"。在并发编程中,原子性指的是"操作不可拆分、不被中断"。Redis既是一个数据库,又是一个支持并发编程的系统,所以他需要考虑到这两种原子性。Redis事务因为不支持回滚,所以很明显是不支持第一种原子性,而是支持第二种原子性的。

@Snailclimb
Copy link
Owner

原子性有两个概念:在数据库中,事务的ACID中原子性指的是"要么都执行要么都回滚"。在并发编程中,原子性指的是"操作不可拆分、不被中断"。Redis既是一个数据库,又是一个支持并发编程的系统,所以他需要考虑到这两种原子性。Redis事务因为不支持回滚,所以很明显是不支持第一种原子性,而是支持第二种原子性的。

还能这么理解,第一次get到,学到了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request or suggestion
Projects
None yet
Development

No branches or pull requests

9 participants