哈喽,大家好,我是有勇气的牛排(全网同名)
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。
官方文档:https://redis.io/docs/manual/transactions/
定义:可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地执行,而不会被其他命令插入,不许加塞。
功能:一个队列中,一次性、顺序性、排他性的执行一系列命令。
1、单独的隔离操作 | Redis的事务仅仅是保证事务的操作会被连续独占的执行,redis命令执行时单线程架构,在执行完事务内所有指令前不可能再去同时执行其他客户端请求的 |
---|---|
2、没有隔离级别的概念 | 因为事务提交前任务指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这种问题了 |
3、不保证原子性 | Redis的事务不能保证原子性,也就是不保证所有指令同时成功or同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力 |
4、排他性 | Redis会保证一个事务的命令一次执行,而不会被其他命令插入。 |
multi
....
exec
discard
假设其中一个语法出错,则所有命令都失败
multi
set a 1
set b # 错误语法
exec
假设有错误命令,成功的不受影响
Redis使用Watch来提供乐观锁定,类似于CAS(Check-and-Set)
就是在exec前,如果原数据被修改,则本此事务失败
# 监控锁
watch <key>
# 放弃监控
unwatch
# 悲观锁(Pessmistic Lock)
每次拿数据的时候都会认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block,直达它拿到锁。
# 乐观锁(Optimistic Lock)
每次拿数据的时候会认为别热不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有咩有去更新这个数据。
乐观锁策略:提交版本必须 > 记录当前版本才能执行更新