Redis事务⼀次可以执行多条命令,按照命令的顺序进⾏串⾏化执⾏,执⾏命令的时候不允许其他命令插⼊,不许加塞。(保证原⼦性)
⼀个 Redis
事务从开始(
MULTI
)到执⾏(
EXEC
)的过程,这段时间内所有的命令都会被序列化、⼊队,在 EXEC
命令被调⽤时⼀次性、按顺序地执⾏
Redis事务四个命令
- MULTI:它标记了⼀个事务块的开始。MULTI 命令之后的所有命令不会⽴即执⾏,⽽是缓存在服务器的⼀个事务队列中,然后当 EXEC 命令被调⽤时⼀次性、按顺序地执⾏。
- EXEC:它标记事务的提交,它的作⽤是触发服务器执⾏所有在 MULTI 之后⼊队的命令。
- DISCARD:如果客户端在 MULTI 之后决定取消事务,那么它可以调⽤ DISCARD命令来做这件事。调⽤ DISCARD 之后,服务器会清空事务队列,并将客户端的状态从事务状态调整回⾮事务状态。
- WATCH key [key ...]:WATCH 命令⽤于在执⾏事务前监控⼀个或多个键,以此来达到乐观锁的效果。如果在调⽤ EXEC 命令执⾏事务之前,有其他客户端抢先对任何⼀个被监视的键进⾏了替换、更新、删除等操作,那么当客户端尝试执⾏事务时,服务器将返回⼀个错误,客户端可以在这时选择重试事务或者放弃事务。
注意:
Redis
的事务不⽀持回滚,即如果事务执⾏过程中出现错误,
Redis
只是简单地停⽌执⾏后续的命令,但是不会回滚已经执⾏的命令。
Redis事务会将命令按照顺序执⾏串⾏化操作,但是如果这些命令中有⼀个命令失败(⾮语法错误)了不会影响到整个事务的执行,只有错误(⾮语法错误)的命令不会执⾏。但如果是语法错误,事务就会被打断。
Redis事务-watch命令(重点)
WATCH 是 Redis 的⼀个事务命令,它为 Redis 提供了乐观锁(Optimistic Locking)的功能。这使得你可以在执⾏事务时添加⼀种并发控制机制。(秒杀业务)
在 Redis 中, WATCH 命令可以⽤来监视⼀个或多个 key,如果在事务执⾏之前这些key 的值发⽣了改变,那么事务将会被打断。
注意:⼀旦执⾏了 EXEC 或 DISCARD 命令,所有的 WATCH 监控都会被取消
。
watch场景流程
- WATCH ⼀个或多个 key。
- 创建事务,即发送 MULTI 命令。
- 发送⼀系列的命令。
- 执⾏事务,即发送 EXEC 命令。此时,如果任何被 WATCH 的 key ⾃你开始WATCH 以来已被其他客户端更改,那么 EXEC 将失败,事务被打断。
场景案例
1)在 A 客户端设置 key : str.lp 登录人数为 10
2)在 A 客户端监视 key : str.lp
3)在 A 客户端开启事务 multi
4)在 A 客户端修改 str.lp 的值为 11
5)在 B 客户端修改 str.lp 的值为 15
6)在 A 客户端执行事务 exec
7)在 A 客户端查看 str.lp 值,A 客户端执行的事务没有提交,因为 WATCH 的 str.lp 的值已经被修改了, 所以放弃了事务。
2056

被折叠的 条评论
为什么被折叠?



