Java从零开始学Rediis——4.深入浅出Redis事务和mysql事务MVCC讲解

请关注订阅,本专栏会详细讲解Java+SpringBoot+Rediis后端开发各个重要的模块,实现网站的开发
本篇内容专门为从事Java后端开发的面试者提供帮助,精准解决面试遇到的问题,欢迎讨论
在这里插入图片描述
关注微信公众号,可免费获取资料

深入浅出剖析传统关系型数据库事务

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

事务的ACID四大特性

  1. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
  2. 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行
  4. 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中

事务隔离机制

  1. 语法:set global transaction isolation level read uncommitted;
  2. 种类:read uncommitted、read committed、repeatable read、serializable
    在这里插入图片描述
    脏读(Read Uncommitted)
    通俗的讲,一个事务在处理过程中读取了另外一个事务未提交的数据。
    你都还没提交,我就读到了你刚操作的数据,万一你回滚了怎么办,你说这脏不脏。
    举例:在这里插入图片描述
    不可重复读(Non-repeatable Read)
    通俗的讲,一个事务范围内,多次查询某个数据,却得到不同的结果。
    与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但实际上是违反了事务的一致性原则。
    举例:在这里插入图片描述
    幻读
    在Repeatable Read隔离级别下,一个事务可能会遇到幻读(Phantom Read)的问题。
    事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。
    举例:在这里插入图片描述

mysql事务隔离机制和MVCC

在这里插入图片描述

InnoDB MVCC多版本并发控制功能讲解:
在每一行数据中额外保存两个隐藏的列:当前行创建时的版本号和删除时的版本号(可能为空,其实还有一列称为回滚指针,用于事务回滚,不在本文范畴)。这里的版本号并不是实际的时间值,而是系统版本号。每开始新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号, 用来和查询每行记录的版本号进行比较.

InnoDB存储引擎存储的每行记录后面都有两个隐形的字段,一个存储行版本号,一个存储行删除标记。
SELECT:
InnoDB会根据两个条件查询数据:
a.行记录的存储版本号小于或等于当前事务的版本号(保证在事务开始前创建、修改或在当前事务时创建、修改)
b.行记录的删除标记未定义或大于当前事务的版本号
INSERT:
InnoDB对新插入的每一行保存当前事务的版本号作为行版本号
DELETE:
InnoDB对删除的每一行保存当前事务的版本号作为删除标记
UPDATE:
InnoDB对更新的每一行保存当前事务版本号作为新的行版本号,并将旧的行版本号作为删除标记

图解InnoDB MVCC的组成和原理

下面是一个非常简版的演示事务对某行记录的更新过程, 当然, InnoDB引擎在内部要做的工作非常多:
在这里插入图片描述

在这里插入图片描述

redis事务机制

MULTI 与 EXEC命令
以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令
在这里插入图片描述

DISCARD命令
DISCARD 命令用于取消一个事务, 它清空客户端的整个事务队列, 然后将客户端从事务状态调整回非事务状态, 最后返回字符串 OK 给客户端, 说明事务已被取消
在这里插入图片描述

WATCH命令
WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败。
在这里插入图片描述
在这里插入图片描述

图解redis执行事务过程原理

1.事务开始

2.命令入队

3.事务执行
在这里插入图片描述

redis事务与传统关系型事务的比较

原子性(Atomicity)

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。如果一个事务队列中的所有命令都被成功地执行,那么称这个事务执行成功。

一致性(Consistency)

入队错误:
在命令入队的过程中,如果客户端向服务器发送了错误的命令,比如命令的参数数量不对,等等, 那么服务器将向客户端返回一个出错信息, 并且将客户端的事务状态设为 REDIS_DIRTY_EXEC 。

执行错误:
如果命令在事务执行的过程中发生错误,比如说,对一个不同类型的 key 执行了错误的操作, 那么 Redis 只会将错误包含在事务的结果中, 这不会引起事务中断或整个失败,不会影响已执行事务命令的结果,也不会影响后面要执行的事务命令, 所以它对事务的一致性也没有影响。
在这里插入图片描述

隔离性(Isolation)

WATCH 命令用于在事务开始之前监视任意数量的键: 当调用 EXEC 命令执行事务时, 如果任意一个被监视的键已经被其他客户端修改了, 那么整个事务不再执行, 直接返回失败

持久性(Durability)

因为事务不过是用队列包裹起了一组 Redis 命令,并没有提供任何额外的持久性功能,所以事务的持久性由 Redis 所使用的持久化模式决定
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java天下第1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值