概览
a:原子性Atomicity
c:一致性Consistency
i:隔离性Isolation
d:持久性Durability
原子性
事务
事务是最小的操作单元,原子性意味着,事务要么全成功要么全都不成功
Undo log
innodb提供的两种事务日志之一,undo log用于实现原子性
事务执行前会记录在undo log,事务执行后,如果出现异常则会根据undo log中记录的操作进行反向操作
(例如:log中记录insert操作,则执行delete。)
即回滚操作,类似git的回滚
隔离性
同一时间只有一个操作能接触到数据
写-写操作的隔离
同时有两个事务对同一个数据进行写操作
innodb会使用锁来确保隔离性,即当有一个事务开始对某数据进行写时,会使改事务获取锁。其他事务改数据的修改会因为获取不到锁而阻塞,直到前面的事务提交或回滚释放锁后,才能获取锁
查看锁的概况
select * from information_schema.innodb.locks
写-读操作的隔离
解决办法为
加锁
数据为当前读时,需要加锁的读,保证读取数据为当前最新
mvcc:多版本并发控制(Multi-Version Concurrency Control)
数据为快照读时,使用readView(具体为一个类)的方式解决
持久性
mysql对数据库的改变是永久性的
常规的数据交互
对数据的修改操作(update)首先会将数据加载到buffer中,再由buffer刷新到磁盘,随机io
redo log
mysql采用redo log(预加载日志),在执行操作前,先将操作写到redo log buffer中,之后写入磁盘redo log文件
再根据redo log文件来进行写操作
相比于常规的优点:
1.保证操作第一时间记录下来,如果发生宕机,方便恢复
2.通过redo log文件进行写操作,属于文件内容追加式写操作,是顺序io,比直接从buffer到磁盘的随机io快速
3.buffer持久化数据是以数据页为单位修改,mysql的默认数据页为16k,一次更新代价较大,而redo log
只更改需要的部分
redo log buffer同步到磁盘的时间,由下面语句控制
innodb_flush_log_at_trx_commit
0:提交事务后,等待主线程每秒刷新
1:事务提交时,将缓冲区的redo log同步写入磁盘(推荐)
2:事务提交时,将缓冲区的redo log异步写入磁盘,不保证成功写入
一致性
上面三个特性加起来保证了一致性
事务执行之后数据库的完整性没有被破坏
事务执行前后数据都是合法的数据状态
数据库的完整性即指没有非法的数据形式出现
————————————————————————————
以上资料仅供学习记录用