事务的隔离级别(附Redis的简述)

数据库事务的特性:
我们一般提到事务都会说它具有ACID特性,那ACID到底代表了什么特性呢?
A:即:Atomicity,代表原子性
是指整个事务中的所有操作,要么全部做,要么全部不做,不可能出现停滞在中间某个环节这种情况。
若事务在执行过程中发生错误,则会被回滚到事务开始前的状态
C:Correspondence,代表一致性
是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏
I:Isolation,代表隔离性
是指:若有两个事务,运行在相同的时间内,并且执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。
这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
D:Durability,代表持久性
是指在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中。
事务必须是原子工作单元。是用户定义的一个数据库操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
事务的四个隔离级别:
1.第一级:
Read uncommitted(读取未提交内容),也是最低的隔离级别
所有事务都可以看到其他未提交事务的结果,它会产生脏读,不可重复读和幻读。
如下所示,将隔离级别设置为Read uncommitted,启动一个事务A,同时再启动一个事务B,当在A中修改数据,且不执行提交,在事务B中也能看到这个更新的数据
在这里插入图片描述
事务A执行更新操作
在这里插入图片描述
事务B也能看到这个更新的数据

2.Read committed(读取提交的内容)
一个事务只能看见已经提交事务所做的改变
保证一个事务修改的数据提交后才能被另一个事务读取 ,另一个事务不能读取该事务未提交的数据
它会导致不可重复读和幻读:
不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。
如下所示:
启动两个事务,事务A执行更新数据的操作,但是并未执行提交,事务B对其不可见。
如图:A中执行更新操作
在这里插入图片描述
B中不可见
在这里插入图片描述
3.Repeatable Read(可重读)
这是MySQL的默认事务隔离级别
它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
它可以防止脏读,不可重复读,但可能出现幻读
幻读:当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
注:InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

在一个事务中执行更新数据操作,只有两个事务都提交了,才能在另一个事务中看到数据变化。
4.Serializable(可串行化) 最高的隔离级别
它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。即:它在每个读的数据行上加上共享锁。
开启两个新事务,事务A和事务B,在事务A没有提交(Commit)之前,
事务B是不能更改数据的
如下所示:
在这里插入图片描述
以上所说的数据库是关系型数据库
在此,我再稍稍提一下非关系型数据库主要是Redis
Redis(Remote Dictionary Server)是非关系型数据库的一种
非关系型数据库(NoSQL)
指在此数据库中,数据之间是无联系的,数据的结构是松散的
NoSQL的优势:
1.数据量大,性能高:可以接受大量的数据
2.无需定义表和列,想添加数据可直接添加
3.高可用:在系统出现故障是,可以快速的解决问题
4.成本低
NoSQL的缺点:
1.数据之间无联系,若想存入几个有关系的内容则不能向关系型数据库那样定义主外键将其相关联,需要分开存储,造成一定程度的空间浪费,若其中一个需要修改,其他的具体的都要修改。
2.没有事务,不能依靠事务的ACID特性
Redis是一个基于内存且支持持久化的key-value的NoSQL数据库,其中每个key和value都是使用对象表示的,具有以以下特征:多样数据类型、持久化、主从同步。
Redis 的三个特点:
(1)Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候,可以再次加载进行使用;
(2)Redis 不仅仅支持简单的key-value类型的数据,同时还提list,set,zset,hash等数据结构的存储;
(3)Redis 支持数据的备份,即master-slave模式的数据备份;
Redis 的五大数据类型
1.String(字符串)
2.Hash(哈希,类似java里的Map)
3.List
4.Set
5.Zset(sorted set: 有序集合)
这些数据类型都支持push/pop、add/remove及取交集并集和差集等操作,而且这些操作都是原子性的。
redis会周期性的使用RDB快照的方式,把更新的数据写入磁盘或者使用类似MySQL的AOF日志方式把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis支持将数据同步到多台从数据库上。
【注:RDB是Redis用来进行持久化的一种方式,是把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。】
Redis对数据的操作过程:
如图所示:
在这里插入图片描述
服务端先访问Redis,若在Redis中找到,直接返回给服务端
若在Redis中没找到,去DataBase中找
服务端从DataBase中得到数据后先缓存进入Redis中,然后将值带到视图层,返回给客户端。减轻了对数据库的查询压力。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值