全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

为什么一个事务能读取到其他事务修改后未提交的数据?

发布时间:2023-10-13 01:25:09
发布人:xqq

一、为什么一个事务能读取到其他事务修改后未提交的数据

在没有正式提交之前,数据是先更新到日志之中的,只有commit提交之后,才真正再从日志中更新到mysql表中。你不用去纠结为什么能读到它。你只需知道,是事务与事务并发进行时,是具有影响性的,这种影响性的大小被称为隔离级别。那怎么防止未提交读呢?就是加写锁,然后提交之后释放锁,在这个时候,mysql的隔离级別就变成了已提交读。而加锁,释放锁是由mysql自动完成的,你无需关心。所以,其实本质上是锁的应用,最终导致了不同的隔离级别,不同的隔离级别,锁的应用也不同。

“数据未提交,那数据库应该没有改变”,这个假设其实是错误的。数据库的底层设计都使用了WAL(Write-ahead**Logging)思想,只不过数据库的事务隔离技术了提供了各种方案,一个数据库请求即使事务没有提交也会发生数据库内部数据的变更,有各种技术,像Mysql InnoDB MVCC,只不过是通过一些字段进行控制。

在数据库没有提交数据的时候,你更新的数据是在缓存进行更新的,事务与事务在并发进行的时候就叫作隔离级别,只有在提交之后,数据才从日志中把数据更新到数据库里面。

目前主流的关系型数据库例如mysql、Oracle都是基于文件系统进行数据存储的,即数据是持久化到文件系统的,但基于文件系统的随机IO读写是非常慢的,故数据库都会引入内存池,完成对磁盘数据的缓存,提高读写性能。内存池是对所有线程共享的,也就是对所有的数据库事务是共享的,所谓的未提交,指的是事务未提交,但此时数据已经存储到了共享内存中,数据已经进入到了数据库服务器中,所以是可见的。

延伸阅读:

二、MongoDB是什么

非关系型数据库(nosql ),属于文档型数据库。MongoDB采用类JSON的documents来存储数据。数据结构由键值(key=>value)对组成。

MongoDB采用动态数据模型schema,这意味着不需要预先定义表的数据类型和字段名。当MongoDB需要更新文档documents的时候,可以轻松增加新的字段名或者删除旧的字段。MongoDB让数据结构更加层级化,因而存储数组等复杂数据结构。 在同一个集合collection中,文档document对字段也没有强约束,因此更容易设计差异化的数据结构。

#it技术干货

相关文章

KEGG 怎么用?

KEGG 怎么用?

2023-10-13
J2EE有什么用?

J2EE有什么用?

2023-10-13
InnoDB的意向锁有什么作用?

InnoDB的意向锁有什么作用?

2023-10-13
什么是职场情商,如何提高?

什么是职场情商,如何提高?

2023-10-13

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取