Java面试八股之每日5问02
1.脏读、不可重复读、幻读的区别脏读是指当一个事务正在访问数据,并且对数据进行了修改,但是修改还没有提交到数据库中,这时另一个事务也访问 这个数据,然后使用了这个没有提交的数据。 不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另一个事务访问该数据并修改。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,第一个事务两次读到的的数据可能是不一样的。 幻读是在一个事务执行期间,读取了其他事务新增或者的数据,导致前后读取到的行数不一致
参考文章: https://cloud.tencent.com/developer/article/1450773 https://www.php.cn/mysql-tutorials-459597.html 2.怎么解决幻读幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。 MySQL 默认的隔离级别是 可重复读 ,在此隔离级别下为了解决"幻读"问题:"快照读"依靠MVCC控制,"当前读"通过间隙锁解决。 select * from t where a=1;属于快照读 select * from t where a=1 for update;属于当前读快照读
当读取的某一行被其他事务锁定时(也就是有其他事务正在改这行数据),它可以从 undo log 中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户进行快照读。在 可重复读 的隔离级别下,从 undo log 中读取的数据总是事务开始时的快照数据(也就是版本号小于当前事务 ID 的数据),在 提交读 的隔离级别下,从 undo log 中读取的总是最新的快照数据(也就是比正在修改这行数据的事务 ID 修改前的数据。)。
原理 :将历史数据存一份快照,所以其他事务增加与删除数据,对于当前事务来说是不可见的。 当前读
因为 MySQL 的默认隔离级别是 可重复读 ,在这种情况下,执行 SELECT...FOR UPDATE 查询语句是,会申请行锁,那么加锁区间其实是 (负无穷,1](1,正无穷 ).。两个加锁区间都可能有数据满足条件,所以会申请行锁中的 next-key lock,对上面这两个区间都加锁,这样其他事务不能往这两个区间插入数据,其他事务执行插入时会一直等待获取锁,直到此事务提交,释放行锁,其他事务才有可能申请到锁,然后进行插入。这样就解决了幻读问题。
原理: 将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取的数据是一致的。
参考文章: https://cloud.tencent.com/developer/article/1437615 https://xie.infoq.cn/article/6abc55424169c68e89efed08d 3.undo log是什么
数据库事务四大特性中有一个是原子性 ,就是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。实际上,原子性底层就是通过 undo log 实现的。undo log主要记录了数据的逻辑变化,比如一条 INSERT 语句,对应一条DELETE 的 undo log ,对于每个 UPDATE 语句,对应一条相反的 UPDATE 的 undo log ,这样在发生错误时,就能回滚到事务之前的数据状态。同时, undo log 也是 MVCC(多版本并发控制)实现的关键。 回滚数据:当数据发生异常错误时,根据执行 undo log 就可以回滚到事务之前的数据状态,保证原子性。 MVCC 一致性视图:通过 undo log 找到对应的数据版本号,是保证 MVCC 视图的一致性的必要条件。 4.redo log是什么
事务的四大特性里面有一个是 持久性 ,具体来说就是只要事务提交成功,那么对数据库做的修改就被永久保存下来了,不可能因为任何原因再回到原来的状态 。如果在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中,做会有严重的性能问题: 因为 Innodb 是以 页 为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了。 一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差。
因此 mysql 设计了 redo log , 具体来说就是只记录事务对数据页做了哪些修改,这样就能完美地解决性能问题了(相对而言文件更小并且是顺序IO)。
redo log 是重做日志,属于 InnoDB储存引擎的日志。是物理日志,日志记录的内容是数据页的更改,这个页"做了什么改动"。如:add xx记录 to Page1,向数据页Page1增加一个记录。
redo log 包括两部分:一个是内存中的日志缓冲(redo log buffer),其是易失的。二是重做日志文件(redo log file),其是持久的。
mysql 每执行一条 DML 语句,先将记录写入 redo log buffer,后续某个时间点再一次性将多个操作记录写到 redo log file。这种 先写日志,再写磁盘 的技术就是 MySQL 里经常说到的 WAL(Write-Ahead Logging) 技术。 5.bin log是什么
binLog。记录了对Mysql数据库执行 更改 的所有操作,但是不包括查看的操作(SELECT 和 SHOW这类操作)。以二进制的形式保存在磁盘中。是属于Mysql Server层记录,任何存储引擎的 mysql 数据库都会记录binlog日志。并且binlog 还是 mysql 的逻辑日志。 逻辑日志:可以简单理解为记录的就是sql语句 。 物理日志:mysql 数据最终是保存在数据页中的,物理日志记录的就是数据页变更 。
在实际应用中, binlog 的主要使用场景有两个,分别是 主从复制 和 数据恢复 。 主从复制 :在 Master 端开启 binlog ,然后将 binlog发送到各个 Slave从 端, Slave 端重放 binlog 从而达到主从数据一致。 数据恢复 :通过使用 mysqlbinlog 工具来恢复数据。 6.3种日志的联系binlog是属于mysql Server层的,属于整个mysql的 redo log、undo log是属于innodb存储引擎独有的 redo log、undo log是事务日志,binlog是二进制日志负责记录对mysql数据库有修改的sql操作。
参考文章: https://cloud.tencent.com/developer/article/1695604 https://www.cnblogs.com/semi-sub/p/14225047.html 极客时间《MySQL45讲》
如有侵权请联系删除
极其罕见!女婴出生时竟长5。7cm尾巴11月27日,墨西哥一名女婴诞生时,被医生发现其身后屁股处长了一根尾巴。根据医生的描述,他们在发现异常后就给婴儿做了详细的检查。他的身体除了身后有一根小尾巴以外,其他的一切正常。经
江苏盐城打造幸福河湖样本湖泊景区美出新高度水是生命之源,良好的河湖生态环境是最普惠的民生福祉。对于百河之城万河之市盐城来说,悟之更深行之更切。摊开盐城地图,只见河湖密布水网相连。全市有河道2。6万余条,总长超过5万公里。其
无限风光在望青春活力满城朱华湘江古镇群里,脚踏石板路寻访汉唐沉淀,品味皮影戏剪纸等非遗魅力山水洲城中,登山骑行滑翔漂流,共享欢乐亲子生活诗意田园里,白天垂钓采果摘菜,夜宿乡间民宿观漫天星空湘江流域,诞生了
走读海宁袁花硖石长安,验证文学时代文郁震宏走读海宁俞永迅珠珠夫妇,刘红巧程屏云山母女郁震宏。海宁,老底子属杭州府,划归嘉兴,不过七十年。海宁的加入,是嘉兴史上最大的实惠,从此,钱江潮王国维徐志摩金庸都成了嘉兴的文化
非洲生活回忆录之最初的印象头条创作挑战赛我的生活日记非洲生活分享非洲,曾经脑海中的边缘之地,只有蛮荒的概念,没有任何的向往。可自己却想不到,有一天会独自一人踏上那块不毛之地,战战兢兢地生活了整整一年。非洲风
冯清利祥云朵朵花果山,一个祥云缭绕的地方。这里山高林密石奇水秀。尤其是那浩渺的烟云,令人神往遐思。从山下往上望,云朵衣袂飘飘,就在山峰之上冲你微笑。及至登上山顶,才发现,云朵如仙女般轻盈地一转身
与道源圣地崆峒山同一市的泾川县因文汇足球队火了崆峒山位于甘肃省平凉市,西接六盘山,东望八百里秦川,南依关山,北峙萧关,是古丝绸之路西出关中之要塞。崆峒山峰峦雄峙,危崖耸立,似鬼斧神工林海浩瀚,烟笼雾锁,如缥缈仙境高峡平湖,水天
前往泰国旅游需谨慎选择泰式按摩,否则将费钱又伤身已经列入世界非物质文化遗产的泰式按摩在泰国深受游客们的青睐。赴泰旅游时,享受一个泰式马杀鸡是个必不可少的项目,选择正确的泰式按摩可以帮助消除旅途中的疲惫并放松身心。然而五花八门的泰
微小说我跟俩洋妞的海岛求生故事(一)十七号那天,我正坐在一架从何蓝飞往吉龙的飞机上。由于飞机出现了故障,机长不得不迫降,然而当时除了山川便是海洋,他为了能让大家活命,不得不选择靠海的地方降落。当时飞机摇晃得厉害,坐在
西藏十二镇魔寺是什么都市传说这几天重温了下藏地密码这本书,对其中描述的西藏十二镇魔寺起了浓厚的兴趣,查阅了一些资料与大家分享。从1991年说起。时年西藏文物局在整理罗布林卡内收藏的文物当中,发现了两幅大小内容
鄱阳湖冬已至越冬候鸟应时而归央广网湖口11月22日消息(记者邓玉玲)11月21日,成群白琵鹭豆雁反嘴鹬等越冬候鸟集结鄱阳湖江西省九江市湖口县湿地,构成了冬日里的一道美丽风景。越冬候鸟集结鄱阳湖江西省九江市湖口