1. 什么是事务
Redis的事务和MySQL的事务概念是类似的,都是把一系列操作绑定成一组,让中一组能够批量执行
Redis事务与MySQL事务的区别:
- 弱化的原子性:Redis没有"回滚机制",只能做到这些操作"批量执行",不能保证全部成执行
- 不保证一致性:不涉及"约束",也没有回滚,事务执行过程中如果某个操作出现失败,就可能引起不一致的情况
- 不具备持久性:Redis本身是内存数据库,数据是存储在内存中的
- 不涉及隔离性:Redis是单线程模型的服务器程序,所有的请求都是"串行"的
Redsi的事务为什么这么简单?
为了保证自己访问速度快的特性,MySQL的事务在背后付出了很多的代价(空间上要花费更多的空间来存储数据,时间上也要更大的执行开销)
Redis事务的主要意义就是为了"打包",避免其他客户端的命令插队
本质上是在服务器上搞了一个"事务队列",每次客户端在事务中进行一个操作,都会把命令先发送到服务器,放到"事务队列"中(不会立即执行)
在收到EXEC命令才会真正执行队列中的所有操作
2. 事务操作
MUTI
开启一个事务,执行成功返回OK
每次添加一个操作,都会提示"QUEUED",说明命令已经进入客户端的队列了

EXEC
真正执行事务

DISCARD
放弃当前事务,此时清空事务队列,之前的操作都不会真正执行

WATCH
在执行事务的时候,如果某个事务中修改的值被别的客户端修改了,此时就容易出现数据不一致的问题
当开启事务的时候,如果对watch的key进行修改,就会记录当前key的"版本号"(版本号是个简单的整数,每次修改都会使版本变大,服务器来维护每个key的版本号情况)
在真正提交事务的时候,如果发现当前服务器上的key的版本号已经超过了事务开始时的版本,就会让事务执行失败(事务中所有的操作都不执行)
客户端1:

客户端2:
执行事务:

UNWATCH
取消对key的监听
相当于WATCH的你操作
