ACID

112 阅读2分钟

ACID

  • 原子性 atomicity: undolog
  • 一致性 consistency
  • 隔离性 isolation: 锁、MVCC
  • 持久性 durability: redolog

LOG

  • slowlog: 设置具体时间将执行超时的sql记录在文件中,方便进行优化调整
  • binlog:DB主从同步
  • errlog: DB进程中一些错误信息
  • relaylog: slaver暂存同步过来的binlog数据
  • undolog: 回滚日志
  • redolog:前滚日志

其中slowlog\binlog\errlog\relaylog归属于mysql server,不管选择啥engine均会存在 undolog\redolog归属于innodb engine,其他存储引擎是不包含该日志信息的

笔记概念

  • WAL:write ahead log (redolog),先顺序写日志,再调整磁盘对象写B+Tree。因为:顺序写磁盘速度远超随机写。

mysql 组提交

redolog里是一个循环写的日志

两阶段提交: 因为redolog \ binlog => redolog和binlog的数据一致性无法保证,(binlog在slave同步时和redolog不一致),那么就存在了问题,为了解决该一致性问题,则出现了两段式提交。 引入redolog (prepare状态)

MVCC

Multi-version concurrency controll, 多版本并发控制, 是用来解决数据并发读写问题的

1、隐藏字段:对于用户不可见
  • DB_TRX_ID: 创建这条记录或者最后一次修改该记录事务的ID
  • DB_ROLL_ID: 回滚指针,指向上一个数据的版本
  • DB_ROW_ID: 隐藏主键,如果数据表没设置PK,会生成一个6字节的ROWID
  • 数据库里,事务编号是递增的
  • undolog: insert\delete\update操作的时候产生方便回滚的日志
2、readview
  • 读视图是在事务进行快照读的时候产生的读视图,保存的不是数据信息,而是事务的相关信息
  • trx_list: 在生成readview时刻,当前系统正在活跃的事务列表
  • up_limit_id: 当前活跃列表中事务ID 最小的值
  • low_limit_id: 系统尚未分配的下一个事务ID
  • 可见性算法????
  • 开始快照读的时候,开启readview
  • 通过实验,readview只是生成了一次(指上面那三个变量);后续的select操作会沿用第一次的readview
2.1 尝试将隔离级别贺readview生成开始练习
  • RC: 每次都读取到其他事务已经提交的数据 ---每次读都生成readview
  • RR:只是解决了不可重复读的问题 --- 在一个事务中,第一次进行快照读的时候生成readview,之后都会沿用之前的readview,而不会重新生成readview
  • 隔离级别的本质是:给了user一个操作入口可以解决不可重复读的问题,本质逻辑在于MVCC
  • 当前读
  • 快照读
2.2 幻读
  • 事务一,begin, select; 事务二:begin, insert, commit; T2,事务一,select \update;则会发生幻读
  • 幻读发生的本质是:如果事务中都是快照读则不会产生幻读问题;但是快照读和当前读一起使用的时候就会产生幻读问题