Redis 事务
Redis 事务
Redis 事务
含义:
- 可以执行 一次 或 多个 命令 。(是一组命令的集合)
- 一个事务中的所有命令都会有序列化。(按顺序的串化执行而不会被其他命令插入,不许加塞)
- 如同 GIT commit 提交。
- 作用:
- 一个队列中,一次性、顺序性、排他性的执行一系列命令。
Redis 常用的命令
DISCARD 取消失误,放弃执行事务内的所有命令
EXEC 执行事务块内的命令
MULTI 标记一个事务的开始
UNWATCH 取消Watch 命令 对所有的 key 的监控
WATCH key [key...] 监视一个或多个 key, 如果在事务执行之前这个(或这些)key 被其他命令所改动,那么事务被打断。
-
正常执行
- 1.标记一个事务的开始 mluti。
- 2. 写入执行的语句,写入的队列(queue)中。
- 3.执行事务 exec
-
放弃事务
- 1.标记一个事务的开始 mluti。
- 2.写入执行的语句,写入到队列(queue)中。
- 3.执行放弃事务 discard。
- 1.标记一个事务的开始 mluti。
-
全体连坐
- 1.标记一个事务的开始 mluti。
-
2.写入执行的语句,写入到队列(queue)中。执行事务 exec,就会报错。
- 当执行语句中有语法错误,就会报错。
-
冤头债主
- 1.标记一个事务的开始 mluti。
- 2.写入执行的语句,写入到队列(queue)中。。
-
3.执行事务 exec。
-
当执行的事务中,有类型错误等逻辑错误 ,只执行对的语句。
-
当执行的事务中,有类型错误等逻辑错误 ,只执行对的语句。
-
watch 监控
-
含义:Watch指令,类似乐观锁,事务提交时。
- 如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行
-
含义:Watch指令,类似乐观锁,事务提交时。
-
悲观锁
- 含义: 很悲观,每次去数据库拿数据的时候都会认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿我这个数据就会block 直到它拿到锁。
-
例如:传统的关系性数据库里边就用到了很多这种锁的机制。
- 行锁
- 表锁
- 读锁
- 写锁
- 都是在操作之前先上锁。
- 缺点:性能下降
-
乐观锁
- 含义: 对事情的发展状况表示乐观状况。
-
例如: 不锁整个表,既保证高并发,又不锁整张表。
- 方法:在每天记录后面加一个字段 version (行锁)
- 乐观的策略:提交的版本必须大于记录当前版本才能执行更新。
- CAS
-
Watch 操作:
- 1.设置 收入为100 ,支出为20, 剩余为80
- 2.监控 收支的情况
- 3.如果Key的值已被别的客户端改变,比如某个list已被别的客户端push/pop过了,整个事务队列都不会被执行。
- a. B 用户 操作balance
- b. A 用户操作 监控的事务操作没有被执行
-
c.小结:
- 通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败)
-
d.当发生以上情况的时候,正确的操作:
- 先执行放弃监控 unwatch
- 加载 监控的对象balance
- 监控 ==>> 标记事务 ==>>执行语句 ==>>执行事务