1、Redis事务本质
一组命令的集合
! 一个事务中所有命令都会被序列化,在事务执行过程中,语句会按照顺序执行 !
也就是说 Redis的事务 会 一次性、顺序性、排他性的 执行一系列的命令
2、Redis事务中没有隔离级别的概念
所有的命令在事务中,并没有直接被执行,只有发起执行命令的时候才会被执行
也就是说 不存在 脏读、幻读、不可重复读 等等现象…
3、Redis 单条命令是保证原子性的,但是事务却不保证原子性
Redis 的事务 三阶段
开启事务(multi)、命令入队(正常书写命令)、执行事务(exec)
4、Redis 事务命令
命令 | 解释 |
---|---|
discard | 取消事务,放弃执行事务块内的所有命令。 |
exec | 执行所有事务块内的命令。 |
multi | 标记一个事务块的开始。 |
unwatch | 取消 watch 命令对所有 key 的监视。 |
watch key [key …] | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 |
5、测试
一段正常成功的事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set name csnz
QUEUED
127.0.0.1:6379(TX)> set age 18
QUEUED
127.0.0.1:6379(TX)> set sex male
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) OK
一段编译型异常的事务(代码有问题,命令有错)事务中 所有的命令都不会被执行
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set name csnz
QUEUED
127.0.0.1:6379(TX)> set age 18
QUEUED
127.0.0.1:6379(TX)> setsetset sex female
(error) ERR unknown command `setsetset`, with args beginning with: `sex`, `female`,
127.0.0.1:6379(TX)> get age
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get age
(nil)
一段运行时异常的事务,如果事务队列中存在语法性,那么执行命令的时候,其他命令是可以正常执行的,错误命令抛出异常!
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set name csnz
QUEUED
127.0.0.1:6379(TX)> incr name
QUEUED
127.0.0.1:6379(TX)> get name
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) "csnz"
127.0.0.1:6379> get name
"csnz"