Redis--Redis 事务及错误处理方式
👨🎓作者:Java 学术趴
💌公众号:Java 学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号 Java 学术趴联系小编。
☠️每日毒鸡汤:一件事你犹豫去不去做,那就是该立即动身做的。
1. Redis 中的事务
1.1 Redis 事务介绍
Redis 事务是一个单独的隔离操作:事务中的所有命令都会被序列化、按顺序地执行。事务在执行过程中,不会被其他客户端发送来的命令请求打断。
Redis 事务的主要作用:串联多个事务,防止命令插队。
Redis 中的事务:就是把所有要执行的操作都按照顺序排列起来,按照顺序一个个的执行,每一个操作的执行不会干扰到其他操作。
1.2 Multi、Exec、discard
从输入 Mulit 命令开始,输入的命令都会依次进入命令队列中,但不会执行。直到输入 Exec 之后,Redis 回将之前的命令队列中的命令依次执行。
组队的过程中可以通过 discard 来放弃组队。
Exec :类似于 Mysql 中的提交事务, discard : 类似于 Mysql 中的回滚事务。
创建一个事务分为三步:
开始事务
编写命令
提交/回滚事务
编写一个事务提交成功的流程
编写一个事务回滚的流程
1.3 Redis 中事务的错误处理
第一种:在组队中,如果某个命令出现错误,执行时整个队列中的命令都会被取消
第二种:如果执行阶段某个命令出现了错误,则只有出现错误的命令不会被执行,而其他的命令都会执行。
1.4 使用事务解决冲突问题
1.4.1 使用悲观锁的方式
悲观锁:顾名思义,就是很悲观的锁,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据的就会 block ,知道它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制。比如:行锁、表锁、读锁、写锁等等,都是在操作之前先上锁。
1.4.2 使用乐观锁的方式
乐观锁:顾名思义,就是很乐观的锁,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号的机制。乐观锁适用于多读的场景,这样可以提高吞吐量, Redis 就是利用这种 check-and-set 机制实现事务的。
1.5 Redis 事务三特性
单独的隔离操作 : 事务中的所有命令都会序列化、按顺序地执行。事务在执行过程中,不会被其他客户端发过来的请求所打断。
没有隔离级别的概念 :队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。
不保证原子性 : 事务中如果有一条命令执行失败,其后的命令任然会被执行,没有回滚。
评论