Skip to content

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

Closed

Description

@WeaveOne

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

Activity

  1. Snailclimb commented on Sep 2, 2019

    @Snailclimb
    Owner

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

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

  2. fangjunpang commented on Oct 2, 2019

    @fangjunpang
  3. WeaveOne commented on Oct 9, 2019

    @WeaveOne
    Author

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

  4. allenshao9 commented on Apr 30, 2020

    @allenshao9

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

  5. JasonLaw1994 commented on May 12, 2020

    @JasonLaw1994

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

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

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

  6. harrymelon commented on Apr 8, 2021

    @harrymelon

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

  7. biggerboy commented on Sep 13, 2022

    @biggerboy

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

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

  8. wuhunyu commented on Sep 23, 2022

    @wuhunyu

    维基百科是这么描述ACID的

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

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

  9. Pa1etteZ commented on May 10, 2024

    @Pa1etteZ

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

  10. Snailclimb commented on May 10, 2024

    @Snailclimb
    Owner

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request or suggestion

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions