Redis事务
数据库事务是什么?
事务是一个或一系列操作的最小逻辑单元,在这个逻辑单元中的所有语句,要不都执行成功,要么都执行失败,不存在任何中间状态,一旦事务执行失败,那么所有的操作都会被撤销,一旦事务执行成功,那么所有的操作结果都会被保存。
Redis事务是什么?
可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞
能干什么?
一个队列中,一次性、顺序性、排他性的执行一系列命令
Redis事务VS数据库事务
| 特性 | 解释 |
|---|---|
| 1.单独的隔离操作 | Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的 |
| 2.没有隔离级别的概念 | 因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了 |
| 3.不保证原子性 | Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力 |
| 4.排他性 | Redis会保证一个事务内的命令依次执行,而不会被其他命令插入 |
常用命令
DISCARD
取消事务,放弃执行事务块内的所有命令
EXEC
执行所有事务块内的命令
MULTI
标记一个事务块的开始
UNWATCH
取消WATCH命令对所有key的监视
WATCH key [key …]
监视一个(或多个)key,如果在事务执行前这个(或这些)key被其他命令所改动,那么事务会被打断
例1:正常执行
- MULTI
- EXEC
例2:放弃事务
- MULTI
- DISCARD
例3:事务中有命令出错,全都不成功
例4:事务中有命令通过编译但是是错误的,出错的语句不执行
注意和传统数据库事务区别,不一定要么一起成功要么一起失败
例5:WATCH
Redis使用Watch来提供乐观锁,类似CAS(Check-and-Set)
- 悲观锁:每次拿数据的时候都会上锁,这样别人在拿数据的时候就会block直到他拿到锁
- 乐观锁:每次拿数据的时候不会上锁,只有在更新的时候会判断期间有没有人去更新这个数据(乐观锁策略:提交版本必须大于记录当前版本才能执行更新)
- CAS:使用WATCH监控key,如果key在修改期间被更新过,则本次事务操作会被打断需要重新执行一次
watch
初始化k1和balance两个key,先监控再开启multi,保证两个key变动在同一个事务内
有加塞篡改

一旦执行了exec,之前的监控锁都会被取消;当客户端连接丢失的时候(退出连接),所有东西都会被取消监视
总结
- 开启:以
multi开始一个事务 - 入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
- 执行:由
exec命令触发事务