Redis事务
目录
前言
谈起事务,就会想起MySQL的四大特性,原子性、隔离性、一致性以及持久性。但是在Redis上,Redis的事务机制主要侧重于原子性,而在一致性、隔离性和持久性方面有一些特殊的实现和限制。并且在原子性上具有巨大的争议!
原子性:事务中包含的所有命令要么全部执行成功,要么全部执行失败,回滚。
而对于Redis而言,如果事务中的某个命令执行失败(例如语法错误或操作错误),事务中的其余命令仍会继续执行。因此对于原子性而言,他是不足的!因此个人而言,其实不具有原子性!并且在官网上,关于原子性的声明也删除了!
一致性:在事务开始之前和事务结束之后,数据库的完整性约束(例如,唯一性约束、外键约束等),没有被破坏;如果被破坏进行回滚
对于Redis而言,没有所谓的约束,更没有回滚机制,所以不具备所谓的一致性
隔离性:多个事务并发执行时,每个事务都有各自独立的操作空间,互不干扰。
Redis事务默认使用单线程处理,因此在执行事务期间不会被其他客户端的命令中断。这确保了在事务执行期间,Redis不会发生并发问题。
持久性:持久性指一旦事务提交,其结果就应该是永久性的。
在redis持久化章节里,我们可以学习到,无论是AOF还是RDB,都无法时刻写入硬盘当中,哪怕是AOF,如果进程异常挂了,那么主存的数据也不会写入硬盘!
一.redis事务原理
redis事务的实现,其实使用了队列。在开始事务,会将之后执行的命令放入一个队列当中,直到执行命令的到来,一旦执行命令来此,队列的任务会按照顺序执行,由Redis主线程将事务的操作都执行!
未使用事务的情况下:
假设商店里,有一件商品,数目为一个,两个客户端都进行购买,一般在Java当中,我们可以使用加锁的方式,如此第二个购买时,就会显示商品已抢空,而不会出现超卖的方式!但是在Redis当中,我们又是什么样的情况呢?
redis会开启事务并监视库存量,由于redis使用单线程处理命令,服务器就会接收先到来的执行命令,等执行完成之后,再进行执行下一条事务,而进行当监视的库存量等于0时,则会取消事务的执行,并且返回一个失败的状态!
注:集群不支持事务
二.事务命令
事务的命令有:
MULTI: 开始事务。之后执行的命令都会被放入一个队列中等待执行。
EXEC: 执行事务。将之前放入队列的所有命令一次性执行。
DISCARD: 取消事务。取消事务中的所有命令,清空事务队列。
WATCH: 监视给定的键。如果在事务执行之前,被监视的键被修改,事务将被打断。
watch的实现
watch类似一个乐观锁,其作用主要是用来监视一个或多个键(key),以便在事务执行之前检测这些键是否被其他客户端修改过。
WATCH 更像是乐观锁中的版本控制机制,而不是传统的悲观锁。它不会直接锁定数据,而是在执行事务前检查监视的键是否被修改,从而决定是否继续执行事务。
特性:
- WATCH 是轻量级的,不会阻塞其他客户端对键的操作。
- 它保证了事务的原子性和一致性,确保在执行事务时,监视的键没有被其他客户端修改过。
扩展资料:Redis有一种lua脚本,可以起到类似事务的效果
原文地址:https://blog.csdn.net/m0_74097410/article/details/140457922
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!