1.事务
1.1什么是事务
事务就是一个包含多个步骤的业务操作,他们被看作是一个不可分割的单位,所有的步骤要么全部成功,要么全部失败。
数据库向用户提供保存当前程序状态的方法,叫事务提交(commit);当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫事务回滚(rollback)。
1.2事务的四大特性(ACID)
原子性:事务是一个原子操作,有一系列动作组成,原子性保证一系列的动作要么全部完成,要么全部不完成。
隔离性:同一时间,只允许同一事务请求同一数据,不同事务之间没有任何干扰
一致性:一旦所有事务动作完成,事务就被提交.,数据和资源就处于一种满足业务规则的一致性状态中。
永久性:一旦事务完成,不管系统发生什么,所写入的结果都不会发生变化。事务完成之后,结果会被永久化的写入存储器中。
1.3事务的隔离级别
事务并发产生的问题:
脏读:读到了脏数据,即无效数据
不可重复读:在数据库访问中,一个事务内的多次相同查询却返回了不同的结果
幻读:指同一个事务内多次查询返回的结果集不一样,比如增加了行记录。
解决脏读,不可重复读,幻读的问题,就需要更高的隔离级别。
1.3.1读未提交
提供了事务间最小限度的隔离。顾名思义,一个事务可以读取另一个事务未提交的数据
1.3.2读已提交
处于读已提交级别的事务可以看到其他事务对数据的修改,也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务在相同查询操作返回的结果是不同的。一个事务要等到另一个事务提交之后才能读取数据。
1.3.3重复读
在开始读取数据(事务开启)时,不再允许修改操作
1.3.4序列化
数据库事务的最高隔离级别。在此级别下,事务串行执行。可以避免脏读、不可重复读、幻读等读现象。但是效率低下,耗费数据库性能。
2.索引
2.1索引的概念
索引是一种特殊的文件,包含着对数据库表里所有记录的引用指针。可以对表中的一列或者多列创建索引。
2.2索引的作用
加快数据检索的速度,提高查询的效率
一个表中的索引,类似于一本书的目录,通过书本的目录,可以很快的查询到我们所需要的内容,如果没有目录,只能一页一页的翻,效率比较低。
2.3索引的缺陷
虽然索引的存在大大提高了查询效率,但是也有两个缺陷:
- 索引会消耗更多的空间
- 当对表中数据进行增删改时,对应的索引也需要维护,因此降低了维护的速度。
但是在实际操作当中,查询操作往往比其他操作多的多,因此使用索引也是一个不错的选择。
2.4索引的使用
在对列进行唯一约束(UNIQUE)或主键约束(PRIMARY KEY)或外键约束(FOREIGN KEY)时,会自动创建对应列的索引。
查看索引
show index fron 表名;
创建索引
create index 索引名 on 表名(列名);
删除索引
drop index 索引名 on 表名;
3.计算机网络模型
OSI七层网络模型主要功能:
- 应用层:为应用程序提供交互服务。在计算机网络中应用层有多种协议,如域名系统DNS,支持万维网的应用HTTP协议,支持电子邮件的SMTP协议
- 表示层:主要负责数据格式转换, 如加密解密,转换翻译,压缩解压等
- 会话层:负责在网络中两节点之间建立连接,维持和终止通信,如服务器器验证用户登录就是在会话层完成的。
- 运输层:有时也称为传输层,向主机进程提供通用的数据传输服务。该层有两种协议:TCP与UDP
- 网络层:选择合适的路由和交换节点,确保数据及时传输,主要包括IP协议。
- 数据链路层:将网络层传下来的IP数据封装成帧,并在相邻节点的链路上传输帧
- 物理层:实现相邻节点比特流的透明传输,尽可能屏蔽传输介质和通信手段的差异
4.TUP与UDP的区别
- 是否有连接:UDP无连接;TCP面向连接
- 是否可靠:UDP是不可靠传输,尽最大努力交付,即不保证可靠交付;TCP可靠传输,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达
- 是否有序:UDP是无序的;TCP是有序的,在传输过程中可能乱序,但是TCP会重新排序
- 传输速度:UDP快,TCP慢
- 连接对象个数:UDP支持一对一,一对多,多对一,多对多;TCP只支持一对一
- 传输方式:UDP面向报文;TCP面向字节流
- 首部开销:UDP首部开销小,TCP首部最小20字节,最大60字节
5.TCP如何保证可靠传输
TCP主要提供了检验和,序列号/确认应答,超时重传,滑动窗口,拥塞控制,流量控制等方法实现可靠传输。
- 检验和:(在TCP协议报头有16位检验)通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错则会直接丢弃TCP端,重新发送。
- 序列号/确认应答:序列号的作用不仅仅是应答的作用,有了序列号可以将接收到的数据按照序列号排序,并且可以去掉重复序列号的数据。
- TCP传输过程中,每次接收方收到数据之后,都会对传输方进行确认应答。也就是发送ACK报文,这个ACK报文中带有确认序列号,告诉发送方,接收到了哪些数据,写一次数据从哪里发送。
- 超时重传:超时重传是指发送出去数据包到接收到数据包之间的时间,如果超过这个时间就认为是丢包了,要重新发送数据。最大超时时间是动态计算的
- 滑动窗口:滑动窗口既提高了发送报文的效率,也避免了因为发送发发送太多数据导致接收方无法正常接收数据
- 拥塞控制:在数据传输过程中,可能由于网络的原因,造成网络拥堵,此时引入拥塞控制,保证可靠传输的同时提高效率
- 流量控制:如果主机A一直向主机B发送数据,不考虑主机B的接收能力,则可能导致主机B的缓冲区已满,不能再接收数据,这会导致大量丢包,引发重传机制。如果再重传过程中,主机B的接收情况仍未好转,则会将大量时间消耗在重传机制上,导致工作效率较低。所以引入流量控制机制,主机B通过告诉主机A的接收缓冲区大小,来使主机A控制发送的数据量。
6.三次握手与四次挥手
6.1三次握手
三次握手是基于TCP协议,是服务器和客户端建立连接的过程。
- 首先由客户端向服务器发送连接请求,请求报文中将SYN置为1;
- 当服务器接收到请求之后,确认连接,发送ACK = 1到客户端,同时服务器也向客户端发送连接请求,SYN = 1,
- 客户端收到连接成功应答的同时,也收到了服务器的连接请求,然后向服务器发送去了ACK应答。
到此,三次握手建立连接已经完成。
6.2四次挥手
四次挥手是服务器与客户端断开连接的一个请求与应答的过程。
- 客户端向服务器端发送释放连接请求,报文FIN = 1,,主动关闭连接,等待服务器的应答
- 客户端收到请求之后,进行应答,报文ACK = 1.此时TCP属于半连接状态,即客户端到服务端的连接已经释放,而服务端到客户端的连接还未释放,可能此时服务器还要发送数据到客户端,因此不能立即断开连接
- 等到没有数据发送时,服务器向客户端发送释放连接请求FIN = 1,等待应答
- 此时客户端确认释放连接,返回确认报文ACK = 1
6.3为什么建立连接是三次握手不是两次握手,不是四次握手呢?
为什么不是两次握手:
- 防止已经过期的连接请求连接到服务器,造成资源浪费:假设客户端首先发送A请求到服务器,但是由于网络拥堵导致A请求没有到达服务器,由于可靠机制,在一段时间之后又重新发送B请求,这次连接成功并且互相传输数据,之后断开连接。最后A请求到达服务器,服务器接收到请求之后开始发送数据,但是此时客户端无法接收数据,导致资源浪费
- 三次握手才能确认自己和对方的接收和发送能力都正常:第一次握手,客户端只是发送请求,无法确认什么,而服务器只能确认客户端发送能力和自己接收能力正常;第二次握手客户端可以确认自己的发送能力和接收能力正常,对方的接收能力和发送能力正常;第三次握手才能让双方都互相确认功能全部正常,此时就可以进行通信了
- 告知对方自己的序号值,并确认对方的序号值:原因之一就是TCP报文中维护了序号字段和确认序号字段,通过这两个字段就可以知道在自己发出的数据中,哪些是已经被对方确认收到的,这两个字段的值会在初始序号值的基础递增,如果是两次握手,只有发起方的序号可以得到确认,而另一方的序号值得不到确认
为什么不是四次握手呢:
因为三次握手已经可以确认双方的发送接收能力了,双方都知道彼此已经准备好了,而且也可以完成对双方初始序号值的确认,所以就无需第四次了
6.4为什么建立连接是三次,而断开连接是四次
断开连接的时候,首先由客户端向服务器发送FIN报文段,在服务器接收到之后首先会给客户端一个ack应答,但是他不能立马断开连接,因为在此时,可能服务器还在向客户端传输数据,所以需要等待一段时间,等到数据传输完成之后,再向客户端发送FIN报文,然后客户端应答,此时连接关闭,这就是四次的原因。