REDIS事务操作
前置知识
什么是事务?
- 一般来讲,事务是具有ACID特性的
- 事务:一般是指一系列指令的集合
- 原子性:事务是一个最小的操作单位,不可分割
- 一致性:事务总是会从一个状态转换到另外一个状态,中间不会发生任何失掉信息的理解,即前后状态是一致的
- 隔离性: 事务之间的操作是相互隔离的,相互不会影响彼此之间的操作
- 持久性: 事务一旦被提交,且会被一直储存在数据库中
REDIS事务
-
但是在redis中,按照原本的事务定义(是一系列指令的集合),是不具备原子性质的,这其实也是redis本身的命令特征来导致的结构,使用一系列指令操作来对数据库进行操作,没有明确的逻辑限制,这也是非关系数据库的一些特点,但是对于redis来说,单个命令是具有原子性的
-
当指令进行集合的时候,如果单个指令语句出现错误,在运行时异常的时候,是不会完全影响整体其他事务操作的,也就是单个出错抛出异常,但是其他正确的语句是仍然会执行的
当语法首先能够通过时,但是其中逻辑操作错误,redis是检测不到的,所以这个时候事务提交是完全正确的,但是逻辑操作出现错误是不会影响其中其他指令操作的
-
127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set someonget dongqing QUEUED 127.0.0.1:6379(TX)> set wangwu push QUEUED 127.0.0.1:6379(TX)> set getone outofthis QUEUED 127.0.0.1:6379(TX)> incr getone QUEUED 127.0.0.1:6379(TX)> exec 1) OK 2) OK 3) OK 4) (error) ERR value is not an integer or out of range 127.0.0.1:6379> get wangwu "push" 127.0.0.1:6379>
-
-
当在编译异常(编码异常时)时候,则会出现整体事务的影响操作
-
出现异常时提交操作
当出现语法异常的时候,你的整体事务都是无法提交的
-
127.0.0.1:6379> multi OK 127.0.0.1:6379(TX)> set jack jocker QUEUED 127.0.0.1:6379(TX)> set no kongwo QUEUED 127.0.0.1:6379(TX)> set push getsomething QUEUED 127.0.0.1:6379(TX)> setget push (error) ERR unknown command 'setget', with args beginning with: 'push' 127.0.0.1:6379(TX)> exec (error) EXECABORT Transaction discarded because of previous errors. 127.0.0.1:6379> get push (nil) 127.0.0.1:6379>
-
事务的创建理解:如下
事务的生命周期(重点理解)
- 创建(开始)一个事务
- …指令集
- 结束一个事务(取消一个事务)
redis还是不同于mysql中的事务操作,mysql事务里面还是存在一些回滚操作,但是redis中就不存在这类的理解
官网的理解
这里只进行基础的几大操作,关于unwatch 以及watch后面锁机制会详细去理解
- multi 事务的开始
- 注:事务一旦被创建了,左侧的redis命令端口就会出现一个TX(事务缩写),注意,所见即所得
- 本人还是不太喜欢所见即所得,真正的内涵永远都是蕴含着表面之下的,如何理解才是必要的
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set dongqing jack
QUEUED
127.0.0.1:6379(TX)> set fbcd queen
QUEUED
127.0.0.1:6379(TX)> set no1 king
QUEUED
127.0.0.1:6379(TX)> set no2 ace
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) OK
4) OK
127.0.0.1:6379> mget dongqing fbcd no1 no2
1) "jack"
2) "queen"
3) "king"
4) "ace"
127.0.0.1:6379> keys *
1) "no2"
2) "no1"
3) "fbcd"
4) "dongqing"
127.0.0.1:6379>
- discard 事务的取消操作
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set queen queen
QUEUED
127.0.0.1:6379(TX)> set toget thefirstone
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> get queen
(nil)
127.0.0.1:6379>
```=
.0.0.1:6379(TX)> set toget thefirstone
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> get queen
(nil)
127.0.0.1:6379>
欢迎关注我的频道,我是一名爱生活的程序员:),随时更新!