【Redis入门到精通八】Redis事务与MySQL事务对比

目录

事务

1.MySQL中事务的特性

2.Redis事务与MySQL事务的区别

3.Redis事务操作演示


事务

        什么是事务呢?事务的概念其实就是把一系列操作绑定成一组,让这一组操作能够批量执行,不过在MySQL中有复杂的机制能够保证这一组操作执行并且一定能成功执行,否则就一条也执行不了,但是Redis中的事务就没有这么靠谱,它只负责把操作绑在一起,如果其中有执行失败的操作,事务无法自动回滚。

1.MySQL中事务的特性

MySQL中事务具有四大特性(ACID)分别是原子性,一致性,隔离性,持久性。

  1. 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
  2. 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
  3. 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。、
  4. 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

MySQL基于事务的隔离性,还延伸出来了三种事务的隔离级别,分别是脏读,不可重复读,幻读从上到下隔离级别越来越高,相应的性能开销也越来越大。

2.Redis事务与MySQL事务的区别

Redis中事务和MySQL事务的区别:

  1. 弱化的原⼦性: redis 没有 "回滚机制". 只能做到这些操作 "批量执⾏". 不能做到 "⼀个失败就恢复到初始状态".
  2. 不保证⼀致性: 不涉及 "约束". 也没有回滚. MySQL 的⼀致性体现的是运⾏事务前和运⾏后 , 结果都是合理有效的, 不会出现中间⾮法状态.
  3. 不需要隔离性: 也没有隔离级别, 因为不会并发执⾏事务 (redis 单线程处理请求) .
  4. 不需要持久性: 是保存在内存的. 是否开启持久化, 是redis-server自己的事情, 和事务⽆关.
        Redis 事务本质上是在服务器上搞了⼀个 "事务队列". 每次客⼾端在事务中进⾏⼀个操作, 都会把命令先发给服务器, 放到 "事务队列" 中(但是并不会立即执行),而是会在真正收到 EXEC 命令之后, 才真正执行队列中的所有操作.

3.Redis事务操作演示

使用multi开启一个事务,执行成功返回OK,并写入一系列操作使用exec执行这些操作。

每次添加⼀个操作,都会提示 "QUEUED",说明命令已经进⼊客⼾端的队列了。真正执行 EXEC 的时候,客⼾端才会真正把上述操作发送给服务器。此时就可以获取到上述 key 的值了。
倘若出现下列情况我们在队列中加入了一个非法语句,这时这个事务操作便无法正常执行操作。

此时我们可以使用discard命令来放弃当前事务,此时直接清空事务队列,之前的操作都不会正常执行。 

在执⾏事务的时候,如果某个事务中修改的值,被别的客⼾端修改了,此时就容易出现数据不⼀致的问题。这时Redis为我们提供了watch操作,在执行multi操作之前执行watch key。
  • 当开启事务的时候, 如果对 watch 的 key 进⾏修改, 就会记录当前 key 的 "版本号"。 (版本号是个简单的整数, 每次修改都会使版本变⼤. 服务器来维护每个 key 的版本号情况)。
  • 在真正提交事务的时候,如果发现当前服务器上的 key 的版本号已经超过了事务开始时的版本号,就会让事务执⾏失败。(事务中的所有操作都不执行)。

在执行事务前我们也可以通过unwatch操作来取消对key的监控。 

❤️😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍

🍔我是小皮侠,谢谢大家都能看到这里!!

🦚主页已更新Java基础内容,数据结构基础,数据库,算法

🚕未来会更新Java项目,SpringBoot,Redis以及各种Java路线会用到的技术。

🎃求点赞!求收藏!求评论!求关注!

🤷‍♀️谢谢大家!!!!!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值