事务四个特点:ACID
原子性:回滚日志(undolog)
一致性:其他三个特点,共同保证了一致性。
隔离性:MVCC,锁
持久性:redolog
MySQL架构
Client -> Server
连接器:管理链接,验证权限
分析器:词法分析,语法分析 - > AST 语法树
优化器:CBO成本,RBO规则
执行器:跟存储引擎交互
存储引擎:innodb myisam memory
MySQL日志系统
错误日志:errorlog
主从同步:binlog
慢日志:slowlog
中继日志:relaylog
回滚日志:undolog(innodb)
前滚日志:redolog(innodb)
WAL:Write Ahead Log 顺序读写
两阶段提交:
先提交redolog,状态为prepare状态;在写binlog,然后redolog进行commit提交。
保证数据一致性。
同步,半同步。给索引加锁
锁是加在数据上还是索引上的?
MVCC
MVCC:multi-version concurrency control : 多版本控制,不需要加锁解决并发读写问题。本质是维持一个数据的多个版本,使得读写操作没有冲突。
数据库三种并发场景:
读读:不需要并发控制。
读写:有数据安全问题,可能存在重复读与脏读; 解决方法:MVCC。
写写:有数据安全问题,会存在丢失更新问题; 解决方法:锁
数据读取方式:
当前读:读取的是数据的最新版本,而且要保证其他事务不能修改当前记录。update
快照读:不加锁的非阻塞读,读取的是历史版本数据,不是最新数据。不加锁的select触发快照读。
MVCC核心组件
隐藏字段:
DB_TRX_ID 记录创建这条记录或者最后一次修改记录的事务ID
DB_ROLL_PTR 回滚指针,指向上一个历史状态
DB_ROW_ID 隐藏主键,如果数据没有主键,那么innodb会生成一个6字节的rowid
事务ID是mysql自动分配的,是自增的。
Undolog:
回滚日志,在进行insert delete update操作的时候,产生的方便回滚的日志信息。
undolog实际是一个链表,链首是最新记录,链尾是最早的旧记录。
undolog不会无线扩大,server层会有一个叫做purge的线程来清理undolog的数据。
ReadView:
表示事务在进行快照读的时候,产生的读视图;在进行快照读的时候,会生成一个数据系统当前的快照,记录并维护的是事务的信息,而不是数据的信息。
trx_list : 数值列表,表示在生成ReadView时,当前系统活跃的事务ID
up_limit_id 表示trx_list 中事务id最小值
low_limit_id :ReadView生成时尚未分配的下一个事务ID
RC隔离级别下,每次进行快照读,都会生成新的ReadView。
RR隔离级别,每个事务只有在第一次进行快照读生成ReadView,之后一直沿用之前的ReadView。
RR隔离级别,能否解决幻读问题? 不能。
幻读出现的本质原因是:
如果事务中,都是快照读,不会出现幻读;如果快照读和当前读一起使用,就出现幻读。
Hyperloglog