事务定义:
- 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样
- 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
- 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆, 必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据
- 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚
上面就是事务的acid四要素,关系型数据的事务都是原子性的,但是redis的事务是非原子性的,之前经历过redis的原子性异常是借助lua嵌入来解决的
这是redis事务的的官方文档介绍 https://www.runoob.com/redis/redis-transactions.htmlhttps://www.runoob.com/redis/redis-transactions.html
redis事务的解释为:单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
换句话说就是事务内存在一连串的命令,中间命令的运行错误并不会影响全命令的执行,而是会跳过该错误命令继续执行,并不会说进行传统事务的回滚操作,但是redis的事务也并不是一点球用没有,至少在执行过程中其他客户端提交的命令请求不会插入到事务执行命令序列中。就是半事务
为什么不支持回滚呢,基于关系型数据库经验来看在事务失败不进行回滚跳过继续向下执行是很奇怪的,优点如下:
- redis错误只是因为语法层面的错误,这个是在编程过程中造成的错误,而且应该在开发阶段就能被发现,不应该出现在生产环境中
- 不需要回滚,在执行的过程中简单快速
总的来说就是redis是不存在回滚的,只能取消事务,比如discard,但是是发现出现了语法错误的时候,因为其是在事务执行之前,实际exec之后就不能回滚了,错了就跳过继续往下执行