长事务的影响和解决办法
长事务的影响
并发情况下 数据库连接池容易被撑爆
锁定太多的数据 造成大量的阻塞和锁超时
执行时间长 在可重复读的隔离级别下 容易造成主从延迟
回滚所需的时间比较长
undo log过大(每一个事务对应一个undo log 用来回滚事务的)
容易死锁
长事务的解决办法
将查询等数据准备操作放到事务外
事务中避免远程调用 远程调用要设置超时 防止事务等待时间过长
事务中避免一次性处理太多数据 可以拆分成多个事务分次处理
更新等涉及加锁的操作尽量放到事务的靠后位置
能异步处理的尽量异步处理
Buffer Pool
Buffer Pool是数据库用来缓存数据页和索引页的内存空间 可以减少磁盘I/O操作 Buffer Pool通过将磁盘上的数据加载到内存 使对数据库的操作主要在内存中进行
三个链表
分别是free链表 flush链表 和lru链表 Buffer Pool可以理解为一个大数组 数组当然也有引用 其中free链表用来存储的就是Buffer Pool中空闲位置的引用 flush链表用来存储哪一页是脏页 就是数据被修改了 但还没来得及写回磁盘的页 而lru是用来淘汰Buffer Pool中的页的 原则是最近最少使用原则 lru链表中分为热数据和冷数据 5:3 当大于一秒的时间再次访问冷数据时 该冷数据就会被转换为热数据
Doublewrite Buffer
当数据要写回磁盘时 会先把数据写入双写缓冲区 这样当数据库挂掉时 就不需要在去读redo log来恢复数据 只需要将双写缓冲区里的数据写入磁盘就可以了
Log Buffer
当数据库执行写操作时 会先把数据写入LogBuffer中 然后再把Log Buffer中的数据写到磁盘的redo log 中
Change Buffer
当事务对数据库中的数据进行修改时 会把数据写入到Change Buffer中