Redis中事务用法详解(ACID)

        在关系型数据库中,事务是指一组命令的集合,这组命令构成了一个原子操作,这个操作要么全部执行成功,要么全部执行失败。而在非关系型数据库 Redis 中并非这样…

        Redis 中的事务同样也是一组命令的集合,这些命令会按序放入一个队列中,等待执行。与关系型数据库不同的是,Redis 允许这些命令部分执行成功。

1、数据据事务的四大特征

  • A:Atomic,原子性,将所有SQL作为原子工作单元执行,要么全部执行,要么全部不执行;
  • C:Consistent,一致性,事务完成后,所有数据的状态都是一致的,即A账户只要减去了100,B账户则必定加上了100;
  • I:Isolation,隔离性,如果有多个事务并发执行,每个事务作出的修改必须与其他事务隔离;
  • D:Duration,持久性,即事务完成后,对数据库数据的修改被持久化存储。

2、Redis 事务特性

        Redis事务是一组命令的集合,一个事务中的所有命令都将被序列化,按照一次性、顺序性、排他性的执行一系列的命令。

单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断;Redis 事务中的所有命令都会存放在队列中按序执行。

没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在”事务内的查询要看到事务里的更新,在事务外查询不能看到”。Redis 事务中的所有命令在没有提交(exec)之前,都不会执行,所以也就不存在关系型数据库中经常出现的脏读,不可重复读,幻读等并发操作的问题。

不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚;Redis 事务不保证原子性,命令如果本身的语法没有问题,只是在执行的过程中出错,不影响其他命令的执行。

3、Redis中与事务相关的命令

  • multi:开启一个事务,类似 MySQL 中的 begin transaction。
  • discard:回滚事务,类似 MySQL 中的 rollback。
  • exec:提交事务,类似 MySQL 中的 commit。

4、Redis事务执行三个阶段

开启:以 MULTI 开始一个事务;
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面;
执行:由 EXEC 命令触发事务;

        事务从输入Multi命令开始,输入的命令都会依次压入命令缓冲队列中,并不会执行,直到输入Exec后,Redis会将之前的命令缓冲队列中的命令依次执行。组队过程中,可以通过discard来放弃组队。

5、Redis事务操作演示

5.1 事务正常执行 

5.2 事务回滚放弃操作

5.3 事务中命令操作错误,全体回滚

注意:如果命令在入队列的时候就发生了错误,将会导致所有命令全部回滚。命令集合中含有错误的指令(注意是语法错误),均连坐,全部失败。

5.4 事务中语法操作错误,错误命令回滚,其它命令正常执行

注意:如果命令本身的语法并没有错误,只是在事务执行的时候某条命令出了错,那么其他的命令不会回滚,正常执行,出错的命令执行失败。运行时错误,即非语法错误,正确命令都会执行,错误命令返回错误。

6、redis事务在python中使用

示例代码:

import redis

res = redis.from_url('redis://192.168.124.49')
print(res)

res.set('name', 'dgw')
res.set('age', 27)

pipe = res.pipeline()
pipe.multi()
pipe.set('name', 'dgw2')
pipe.set('age', 28)
#  reset之后,事务被取消,pipe.set('name', 'dgw2')和pipe.set('age', 28)都不会执行
pipe.reset()
s = pipe.execute()
print(s)

s2 = res.mget('name', 'age')
print(s2)

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值