事务原理
事务是一组操作的集合,是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
特性:
原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
一致性:事务完成时,必须使所有的数据保持一致的状态。
隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
持久性:事务一旦提交或者回滚,对数据库的数据的改变是永久的。
redo log
重做日志,记录的是事务提交时数据页的物理修改,是用来实现事物的持久性。
该日志文件由两部分组成:重做日志缓冲,以及重做日志文件,前者是在内存中,后者是在磁盘中,当事务提交之后,会把所有修改信息都存在该日志文件中,用于在刷新脏页到磁盘,发生错误时,进行数据恢复使用。
undo log
回滚日志,用于记录数据被修改前的信息,作用有两个:提供回滚和MVCC。
undo log 是逻辑日志。可以认为当 delete 一条记录时,undo log 中会记录一条对应的 insert 记录,反之亦然,当 update 一条记录时,他记录一条对应相反的 update 记录,当执行 rollback 时,就可以从 undo log 中的逻辑记录读取到相应的内容并进行回滚。
Undo log 销毁:undo log 在事务执行时产生,事务提交时,并不会立即删除 undo log,因为这些日志可能还用于 MVCC。
Undo log 存储:采用段的方式进行管理和记录,存放在前面介绍的 rollback segment 回滚段中,内部包含 1024个 rollback segment。
MVCC--基本概念
当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁,对于我们的日常操作,如:select...lock in share mode(共享锁),select...for update,update,insert,delete(排它锁)都是一种当前读。
快照读
简单的 select (不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读。
Read Committed:每次 select 都生成一个快照读。
Repeatable Read:开启事务后第一个 select 语句才是快照读的地方。
Serializable:快照读会退化为当前读。
MVCC
多版本并发控制,指维护一个数据的多个版本,使得读写操作没有冲突,快照读为 MySQL 实现 MVCC 提供了一个非阻塞功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段,undo log 日志,readView。
记录中的隐藏字段
undo log 版本链
不同事务或相同事务对同一条记录进行修改,会导致该记录的 undo log 生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。
ReadView 是快照读 SQL 执行时 MVCC 提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。包含四个字段:
MySQL 管理
MySQL 安装完成之后自带四个数据库
Ending:
OK,本篇文章就到此结束了,非常感谢你能看到这里,所以如果你觉得这篇文章对你有帮助的话,请点一个大大的赞,支持一下博主,若你觉得有什么问题或疑问,欢迎私信博主或在评论区指出~