面试复习之-数据库基础

今天刚看到数据库的基础


获取的资料:

例如:

  1. 数据库系统原理 | CS-Notes
  2. 数据库基础知识总结 | JavaGuide
  3. 我觉得讲MVCC最好的:MVCC 水略深,但是弄懂了真的好爽!
  4. 我觉得将Next-Key Locks最好的:mysql锁机制之间隙锁(Next-Key锁)(五) - 走看看

学习时长:

4小时


学习产出:

提示:这里统计学习计划的总量

例如:

  • 事务的基本特性?
    • ACID
    • 原子性:一个事务中的操作要么全部提交成功,要么全部失败回滚(undo log)
    • 一致性:数据库在事务执行前后都保持一致性状态。多个事务查同一条数据的数据,读取的结果是一致的
    • 隔离性:事务在提交之前,其他事务不可得知它的修改数据
    • 持久性:事务提交之后,所做的改变会永久保留在数据库中,系统崩溃了也是(redo log)
    • 原子性和隔离性都是为了保证一致性从而保证执行结果正确
    • 持久性是为了应对系统的崩溃
  • 并发时数据库会出现什么问题?
    • 丢失修改:事务A写x=10,事务B随后写x=20,最后得出的结果是X=20,事务A所做的修改被事务B覆盖了
    • 脏数据:事务A写X=10,事务B读到X=10,然后事务A回滚,这样事务B得到的数据就是错的
    • 不可重复读:事务B读X=10,随后事务A写X=20,事务B再读X = 20,两次读的数据不一致
    • 幻读,事务B查某个条件的数据有10条,事务A加了一条符合条件的数据,事务B再查相同的条件,有11条
  • 事务的隔离级别
    • 未提交读:事务中的修改,在未提交的时候,其他事务可以读到
    • 提交读:提交了之后,其他事务才可以读到
    • 可重复读:一个事务,读同一条数据,结果一致
    • 可串行化:一个一个事务串行执行
  • MVCC
    • 多版本并发控制,当前读和快照读,我们读数据同快照读,修改数据用当前读,我们的表中有隐藏的三列,row_id/trx_id/roll_pointer,row_id是行id,没有设置主键的时候数据库就会隐式设个主键,为聚簇索引,trx_id是事务id,记录当前行是哪个事务id修改的,roll_pointer:回滚指针,指向存放在undolog里面的上一个版本的数据
    • 读的那个事务在生成的时候,会生成一个readView,记录现在数据库中活跃的(事务开始了但是还没提交)事务id,
      • 如果当前事务id==表里面的事务id,证明这一条数据的修改是因为当前事务,可以读;
      • 行里的事务id小于readView的最小事务id,证明这个行的事务id已经提交,可以读;
      • 行的事务id>readView的最大事务id,证明该修改是在事务启动后修改的,所以不可以读;行的事务id的大小在最大事务id之前,最小事务id之后,如果是提交读分情况:行事务id在里面,不可用,否则可用,是可重复读就不可用,因为如果可用的话其他事务会对它进行修改,当前事务读这个数据就会改变;
    • 快照读:针对select的动作不加锁,读快照
    • 当前读:对非select操作加锁
  • Next-Key Locks
    • next-key Locks 它是一个可以锁住间隙的锁,用于解决幻读的问题,它锁住的是一段左开右闭合的区间,在非唯一索引列上的每一条记录都有,例如我要锁住一个账户里面有100~1000块的记录,则会获取到这个区间的所有临键锁,如果我要获取账户里面有10块的记录,我就会获取到所有账户里面有10块的记录的临键锁加上对应的下一区间的临键锁,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值