MySQL事务的实现原理
首先我们要知道事务的特性(ACID)
-
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败。 -
一致性(Consistency)
官网上事务一致性的概念是:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。 -
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。 -
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
然后我们需要了解什么是undo log、redo log、读、写锁、MVCC
-
undo log(回滚日志)
用于记录数据被修改前的信息,主要记录的是数据的逻辑变化,每次写入数据或者修改数据之前都会把修改前的信息记录到 undo log,目的是为了在发生错误时回滚。 -
redo log(重做日志)
该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。当事务成功提交之后会把所有修改信息都会存到该日志中。 -
读、写锁(共享、排他锁)
读锁是可以共享的,或者说多个读请求可以共享一把锁读数据,不会造成阻塞;写锁会排斥其他所有获取锁的请求,一直阻塞,直到写入完成释放锁。 -
MVCC (MultiVersion Concurrency Control) 多版本并发控制
InnoDB的 MVCC ,是通过在每行记录的后面保存三个隐藏的列来实现的。即DB_TXR_ID事务id、DB_ROLL_PTR回滚指针、DB_ROW_ID行号
主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。
MVCC在mysql中的实现依赖的是undo log与read view,通过读写锁来控制,其只在RR/RC隔离级别下工作
undo log :undo log 中记录某行数据的多个版本的数据。
read view :用来判断当前版本数据的可见性
事务的实现
前面讲的重做日志,回滚日志以及锁技术就是实现事务的基础。
-
事务的原子性是通过 undo log 来实现的
-
事务的持久性性是通过 redo log 来实现的
-
事务的隔离性是通过 (读写锁+MVCC)来实现的
-
一致性是通过原子性,持久性,隔离性来实现的