全称就是 多版本并发控制,是MySQL用来解决读写冲突的一种手段,可以实现读写不阻塞。

存在于读已提交和可重复读的情况下,读未提交不需要加锁直接读最新数据,而串行化普通select都给你加锁

MVCC依赖什么实现的?

1.数据库的隐藏字段:

rollback_pointer 回滚指针

trx_id:最近修改该行数据的事务ID

2.undo log版本链:记录的是事务变更前的数据

3.readView:快照读情况下生成的一个读视图,生成的一个快照,用来解决数据的可见性问题,有以下

字段

trx_ids:生成readview时当前系统还获活跃的事务ID集合

low_limit_id:应该分配给下一个事务的ID

up_limit_id:没提交事务中的最小ID

creator_trx_id:创建该read view的事务ID

ps: trx_ids=[up_limit_id,low_limit_id)

MVCC是如何判断数据的可见性的?

1.首先先判断本条数据是否由本事务产生(trx_id=creator_trx_id),如果是,那么就一定是可见,毕

竟是自己产生的

2.再判断**本条数据**的事务ID是否小于没提交事务的最小ID,如果是,那就可见,因为说明这数据已经被

其它事务所提交了,本事务是可见的

3.再判断本条数据是否在活跃事务集合中,如果不在,那么说明该数据已经被其他事务所提交

如果本条数据不存在的话,那么就会根据rollback pointer和undo log去找上一个版本的数据,然后重复

以上判断

readview产生时机

1.可重复读的情况下,只在事务第一次快照读时产生readview,后面会复用这个快照如果事务启动时选择

了with consistent snapshot,事务启动时就建立快照

2.读已提交的情况下,每次快照读都产生新的readview

二级索引在索引覆盖时如何使用MVCC?

隐藏字段在聚簇索引上,所以二级索引不回表要怎么使用MVCC?二级索引中,用了一个额外的名

page_max_trx_id来表示修改过该页的最大事务ID,然后用readview里的up_limit_id即没提交的事务中的

最小ID去和它比对,发现比它大,那么说明该页的数据是可见的。如果不可见,就需要回表。

所以我们可以得出一个结论,即使用到了索引覆盖,也不一定不回表

mac地址是负责两台直连设备之间的设备,而IP地址是负责两台没直连设备之间的通信。在数据传输过程中,

源mac地址和目标mac地址经过中转后就会变化,而IP则不会

为什么有mac地址后,还要有IP地址

mac可以看做是一个人的身份证,IP可以看做是一个人的家庭地址

幂等问题有两种

  • 请求幂等:每次请求,如果参数一样,结果也要一样
  • 业务幂等:同一次业务请求,推进到最终状态之后的每次请求,结果要保持一致。没推进到最终状态之前,每一次请求都要正常执行业务逻辑,直到推进到最终状态

一般来说我们保证的是业务幂等

口诀:一锁,二判,三更新

  • 锁:锁建议用redis,毕竟它是高性能的互斥非阻塞锁。但锁也不是必须的,如果不是高并发的话,建议直接查,后面通过乐观锁来控制插入or更新
  • 判:是否已经执行过了
  • 更新

它的作用:用来检测两台设备之间是否可以建立连接

为什么ping不需要端口

ping是基于IP层的协议实现,即应用层直接使用网络层协议的例子,而端口是传输层的东西,两者不相关,故不需要

解析URL,确定好目标web服务器和请求目标的文件,并生成对应请求报文

URL结构

请求报文结构和响应报文结构

进行DNS解析,拿到IP地址

拿着IP地址,找到服务端,建立TCP连接

协议栈?指南小助手。浏览器拿到IP地址后,这时候就可以把HTTP请求的传输工作交给操作系统的协议栈了。这个东西就是说上面的部分会去把任务委托给下面的部分,然后下面的部分就会去执行任务

画板

IP还分为ARP协议 ICMP

  • ARP协议:用来讲IP地址查询局域网中的MAC地址
  • ICMP协议

网卡驱动程序负责控制网卡,而网卡负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作

朝着IP地址,发送HTTP请求

服务器处理请求,

关闭TCP连接

浏览器解析HTML

浏览器渲染资源