为啥一个事务能读取到其他事务修改后未提交的数据
在没有正式提交之前,数据是先更新到日志之中的,只有commit提交之后,才真正再从日志中更新到mysql表中。你不用去纠结为什么能读到它。你只需知道,是事务与事务并发进行时,是具有影响性的,这种影响性的大小被称为隔离级别。那怎么防止未提交读呢?就是加写锁,然后提交之后释放锁,在这个时候,mysql的隔离级別就变成了已提交读。而加锁,释放锁是由mysql自动完成的,你无需关心。所以,其实本质上是锁的应用,最终导致了不同的隔离级别,不同的隔离级别,锁的应用也不同。
现在互联网应用的数据量越来越大,企业对数据库优化看的越来越重,同样也是面试必问项,答好了更是加分项。
由于在上回答关于sql优化方面的问题,因为有教学从业经验,内容又能很容易看懂,获得了不少人的认可和点评。所以最后,我又补充了很多干货,整理成了笔记,免费送,超过市面上各种培训机构该部分内容的质量,是个很好的补充。



■网友
commit的作用**不是**把缓存/内存中的数据更新/同步到数据库。commit 之前,数据已经提交到服务器了,只是写在日志里,没有正式提交。所以可以被另外的客户端读取。
■网友
买本\u0026lt;数据库系统实现\u0026gt;看吧。
预备知识
1首先内存/cache的访问时间和硬盘差6个数量级左右,大概是地球和太阳那个级别的区别。
所以每次读写硬盘都是非常昂贵的。 
```````````````````````````````````````````````````````````````````````````````````````````````````````````
好了,《数据库系统实现》是这么介绍的:
内存中会有一个缓冲区。
然后定义以下几个原语:
INPUT(X) :将X的数据加载到上述的主存/内存缓冲区。OUTPUT(X):将X 的数据写硬盘。Read(X,t) :将在已经加载到内存/主存的X的数据写入到事务的局部变量t中。WRITE(X,t):将已经在事务局部变量t的值写入主存/内存数据库元素X中 对于每个事务,都是将数据加载到内存缓冲区中,然后一个事务修改的话,会Read进事务局部 空间,处理完如果是update 那类会再WRITE回内存缓冲区。
什么时候会写回硬盘呢?
//todo
2 事务只是保证原子性,而这个和平时的原子性有一点点区别。一般所指的原子性指的是和临界区一个意思。而数据库事务的原子性指的是“要么整个事务都完成,要么都不完成(回滚)”。
2commit只是保证你数据库故障时候回滚不会回滚这个事务了,或者说只要commit这个语句写入redo日志了就算缓冲区的数据没有写会硬盘或者其他持久化设备也是可以通过redo表将新的值写回去,整个事务没有丢失。
3事务区缓冲区是事务缓冲区,应该和日志缓冲区没什么关系的。
■网友
因为你设置了可以read那些uncommited的数据啊!
■网友
当设置事务隔离级别为Read Ucommitted的时候,一个事务(A)能读取到另一个事务(B)修改后【未提交】的数据。
推荐阅读
- 同比■同比增长7.1%!2021年的第一个节你花了多少钱?
- “他是我第一个会说普通话的老师”:一对师生折射青海山村蝶变
- 有必要重新开个C店吗
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 大学再有三个月就结束了,没学到知识,参加一个软件测试培训机构好吗
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|长安UNI-K又将开创一个新的"引力"纪元?
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
