• Redis中的事务可以满足ACID属性吗?


    前言

    事务是数据库操作的最小工作单元,由一个有限的数据库操作序列构成。这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。一键获取最先java文档。

    在这里插入图片描述

    事务在执行时,会提供专门的属性保证:原子性、一致性、隔离性和持久性,也就是ACID属性。这些属性包括了对执行结果的要求,同时也有对数据库在事务执行前后数据状态变化的要求。

    大家可能会问,既然事务是数据库特有的机制,那么Redis可以完全保证ACID属性吗?如果有些属性在一些场景下不能保证,很可能会造成数据错误,我们又该如何应对呢?

    接下来,我们先从 ACID 属性入手,然后再来看 Redis 是如何实现事务的。

    事务 ACID 属性

    • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的多个的操作要么全部被执行,要么都不执行。这也是业务应用事务时,最被看重的一个属性。

    • 一致性(Consistency):就是指数据库中的数据在事务执行前后是一致的。最典型的就是转账的例子,不管用户之间转几次帐,如何转账,事务结束后两个用户钱的总额是不变的。

    • 隔离性(Isolation):与事务并发直接相关,隔离性是指并发执行的事务之间不能相互影响。简单说,对于任意两个并发的事务 T1 和 T2,在事务 T1 看来,T2 要么在 T1 开始之前就已经结束,要么在 T1 结束之后才开始。这样每个事务都感觉不到有其他事务在并发地执行。

    • 持久性(Durability):事务一旦提交,所有对数据库数据的修改将永久的保存,即使系统崩溃重启后数据也不会丢失。

    了解了 ACID 属性之后,我们接下来看 Redis 是如何实现事务机制的。

    Redis 如何实现事务?

    Redis提供了MULTI、EXEC、DISCARD和WATCH命令作为实现事务的的基础。

    Redis 事务的执行过程包含三个步骤:

    • 开启事务:客户端通过MULTI命令,显式地开启一个事务;

    • 命令入队:客户端把事务中要执行的一系列指令发送给服务器端,如GET、SET等。需要注意,这些指令只是暂存到命令队列中,并不会立即执行;

    • 提交事务,执行第二步提交的命令:客户端向服务器端发送提交事务的命令 EXEC,当服务端收到 EXEC命令后,才会实际执行命令队列中的所有命令。

    使用 MULTI和 EXEC执行事务的过程:

    #设置a:stock为10
    127.0.0.1:6379> SET a:stock 10
    OK
    
    #设置b:stock为20
    127.0.0.1:6379> SET b:stock 20
    OK
    
    #开启事务
    127.0.0.1:6379> MULTI
    OK
    
    #将a:stock减1
    127.0.0.1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    微信小程序开发——自定义堆叠图
    【JavaScript】JS开发中五个常用功能/案例(31-35)(牛客题解)
    16.Xaml WrapPanel控件 ---> 流面板
    计算机基础知识——字,字节,进制,short,byte等
    (Matlab)基于蝙蝠算法实现电力系统经济调度
    IntelliJ IDEA 2023.2 主要更新了什么?(图文版)
    数据库系列MySQL:数据类型及用途
    Python:Tornado框架之获取get和post的传参
    springboot+vue
    Linux·安装编译libncurses5-dev遇到的问题
  • 原文地址:https://blog.csdn.net/m0_48795607/article/details/128154390