数据库
ACID
- A 原子性:事务只能提交或者未提交
- C 一致性:执行前后都必须处于一致状态
- 例如a-1 b+1 如果a-1失败 b+1也必须失败
- I 隔离性:多个事务之间不互相影响
- D 持久性:事务一旦提交,改变为永久
语法
left join:
- on后面的约束语句只会影响右表 如果要对结果表进行筛选必须用where right join同理
in 和 exists:
- in 是先查询子查询然后内表外表做一个笛卡尔积 子查询比较小情况适用
- exists是先执行外部表的查询,然后在子查询中做外部查询次数的where 查询 返回True的就返回值 子查询比较大情况适用
其他
- not in not exists 尽量用not exists
- floor 下取整
- ceil 上取整
问题
- 脏读:读取未提交的事务:被回滚(不能读取未提交的事务)
- 不可重复读:读取了提交的新事务(读取过程中有事务写入)(读取过程中加锁不能写入)
- 幻读:读取了提交的新事物(读取过程中有增删)(表锁)
隔离级别
- 读未提交:最低的更新级别(一个事务可以读取宁一个事务并未提交的更新结果)可能导致脏读,不可重复度,幻读
- 已提交读:只能读取已经提交的事务 可能导致不可重复读 幻读(只有写锁,无读锁)
- 重复读:加了读锁(行锁)(只有事务完成后才能进行更新操作)可能读取过程中会有新增数据发生幻读
- 序列化:最高事务级别 事务顺序执行
补充知识
- 行级锁:select * 只给查询到的行加锁 仍可以在表中添加数据
- select * for update(实现对表加锁):悲观锁
- 乐观锁:Version比对实现
- 元组:每行
- 码:列
- 一范式:一个字段只能有单个属性
- 二范式:增加主键
- 三范式:非主属性不存在传递依赖
计算机网络
进程和线程
- 进程包含线程:进程是资源分配的最小单位,线程是调度的最小单位
- 进程间通信:管道,有名管道(可以允许无亲缘关系的进程通信),信号量,消息队列,共享内存,套接字(不同设备间的进程通信)
- 线程间通信:锁(排它锁,条件变量,读写锁),信号量,信号机制
- 协程是用户控制的轻量级线程
TCP
- 3次握手 Client发送连接server,server确认回复,client确认收到再告诉我收到回复
- 4次挥手 client发送断开,server发送收到断开的消息,server发送确认断开,client发送确认收到断开消息
TCP状态转换
- tcp初始化为closed状态,然后client发送消息转换为syn_sent状态
- server被动为listen状态,收到消息然后发送syn和ack+1然后转换为syn_rcvd
- client收到消息转换为established状态,发送ack+1 server变成established状态,开始传输数据
- client主动关闭变为fin_wait_1状态
- server收到syn变成close_wait状态发送ack
- client收到ack变成fin_wait_2状态
- server数据传输完成之后发送LAST_ACK or final_ack
- client等待时间终结变为TIME_WAIT状态发送ack变为closed状态
HTTPS流程
- 请求url
- 从服务器返回公钥证书
- 验证公钥证书
- 生成会话密钥用公钥加密会话密钥并发送给服务器
- 服务器私钥解密,
- 会话密钥加密会话消息
- 返回会话密钥加密后的密文,客户端解密
- 用会话密钥加密信息发送给服务端,服务端会话密钥解密
拥塞控制:
- 慢开始:从小到大的逐渐增大发送窗口
- 到达阈值之前指数增大,到达之后线性增大
- 拥塞避免:
- 让拥塞窗口缓慢增大,遇到数据丢失,数据窗口从零开始
- 快重传
- 当遇到接收方三次check某个消息,则重发这个消息的下一条消息
- 快恢复:拥塞控制算法
- 遇到快重传之后发送窗口将为原来窗口的一半