Redis的事务和锁机制
这里是允谦的学习之路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励把QAQ
👋博客主页🎉 允谦的学习小屋
⭐️更多文章👨🎓请关注允谦主页📝
🍅文章发布日期:2022.03.01
👋java学习之路!
欢迎各位🔎点赞👍评论收藏⭐️
🎄冲冲冲、持续更新🎄
文章目录
1、Redis的事务定义
Redis事务是一个单独的隔离操作:事务中所有的命令都会序列化、按顺序的执行。事务在执行过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
2、Multi、Exec、discard
从输入Multi命令开始,输入的命令都会和一次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令一次执行。
组队的过程中可以通过discard来放弃组队。
3、事务的错误处理
取消组队的情况
组队的过程中,有一个错误,上面的所有指令都不能执行
组队时成功,运行时出错,不影响别的指令执行
4、事务冲突的问题
4.1悲观锁
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
4.2 乐观锁
4.3 WATCH key[key …]
在执行multi之前,先执行watch key [key…] 可以监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。
5、Redis事务三特性:
- 单独的隔离操作:
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 - 没有隔离级别的概念:
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行 - 不保证原子性:
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
交前任何指令都不会被实际执行
- 不保证原子性:
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚