事物的特点是ACID:
- 原子性。
- 一致性:一致性是我们的根本追求,一致性的实现是由其他三个特点来保证的。
- 隔离性:通过锁的机制来实现,但是加锁之后效率变低了。MVCC(Multi-Version Concurrency Control)多版本并发控制。
- 持久性:redolog。
日志系统:
- binlog:二进制日志,数据同步以及恢复,存于server,binlog可用于主从复制和数据恢复。
- undolog:回滚日志,存于innodb等,在磁盘里,断电不会丢失数据。
- redolog:前滚日志,存于innodb等,在磁盘里,断电不会丢失数据,它不会整理数据,有一个固定空间来循环写数据(新数据进来后如果超过空间大小了,旧数据会被踢出)。
- errorlog:错误日志。
- slowlog:慢日志。
- relaylog:中继日志。
binlog和redolog都会同时记录数据,它们记录的顺序不是先哪个后哪个。这里有个“二阶段提交”的概念。如果先写redolog再写binlog,或者反过来,都有问题——当一个写好另一个还没写好的时候如果断电情况。
IO操作:
- 随机IO。
- 顺序IO。
数据库里的并发分几种情况:
- 读读:不存在任何问题,也不需要并发控制。
- 读写:有数据安全问题,脏读、幻读,不可重复读。
- 写写:有数据安全问题,可能存在更新丢失问题。
当前读:数据读取的时候读取的都是最新的版本数据。select lock in share mode, select for update, update, delete, insert这些操作基本都是触发当前读。
快照读:读取历史版本的数据。select有可能触发快照读(set autocommit=0;)。
隐藏字段:
- DB_TRX_ID:创建这条记录或者最后一次修改该记录的事物id。
- DB_ROLL_PRT:回滚指针,指向数据的上一个版本。
- DB_ROW_ID:隐藏主键,如果没有显示主键的话,就会多一个隐藏主键。
MySQL默认的隔离级别是REPEATABLE-READ(通过select @@transaction_isolation;可查);
MVCC(Multi-Version Concurrency Control)多版本并发控制。
CAS:compare and swap。