今天刚看到数据库的基础
获取的资料:
例如:
- 数据库系统原理 | CS-Notes
- 数据库基础知识总结 | JavaGuide
- 我觉得讲MVCC最好的:MVCC 水略深,但是弄懂了真的好爽!
- 我觉得将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块的记录的临键锁加上对应的下一区间的临键锁,