Redis--事务
- 是什么
- 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行执行而不会被其它命令插入,不许加塞
-
官网
- 能干什么
- 一个队列中,一次性的、顺序的、排他性的执行一系列命令
- 怎么玩
-
常用命令
-
Case1:正常执行
-
Case2:放弃事务,使用discard可以使事务放弃执行
-
Case3: 全体连坐,中间有一个失败的命令会使事务的全部命令都不执行,在加入队列的时候就抛出异常,使全体连坐
-
Case4:冤头债主,在加入队列的时候没有抛出异常而是在exec后,事务执行时命令出现异常
-
Case5:watch监控
-
悲观锁/乐观锁/CAS(Check And Set)
- 悲观锁:(表锁)悲观锁就是把整张表都锁了,并发性极差,但一致性较好
- 乐观锁:(提交的某条记录的版本号必须大于数据库中记录的版本号)乐观锁不锁整表,在每条记录的后面加一个version版本号,张三去改一条记录,此时这条记录的版本是1,此时李四也是改这条记录且版本也是1,且李四修改完成后提交,这条版本号就会变为2,如此是张三修改完成,提交时会出现异常,他修改的的是版本1,但是这条记录的版本是2了,所以会报异常,需要重新从数据中找到版本号为2的记录进行重新修改,才能修改完成。
- CAS:
- 悲观锁:(表锁)悲观锁就是把整张表都锁了,并发性极差,但一致性较好
-
初始化信用卡可用余额和欠额
-
无加塞篡改,先监控再开启multi,保证两笔金额变动在同一个事务内
-
有加塞篡改:监控了key,如果key被修改了,后面一个事务的执行失效
-
unwatch(使用内存中最新的数据才能进行修改)
-
一旦执行了exec之前加的监控锁都会被取消掉了,wath命令对某条数据进行监控,如果事务执行过程中,被监视的数据被修改过,则事务事务执行不成功,
-
小结
-
Watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行
-
通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败
-
-
-
- 3阶段
-
开启:以MULTI开始一个事务
-
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里面
-
执行:由EXEC命令触发事务
-
- 3特性
-
单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
-
没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在"事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题
-
不保证原子性: redis同一一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
-