事务功能的三个技术,分别是日志文件(redo log 和 undo log),锁技术以及MVCC
redo log
redo log叫做重做日志,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log),前者是在内存中,后者在磁盘中。
当事务提交之后会把所有修改信息都会存到该日志中。
总结:redo log是用来恢复数据的 用于保障,已提交事务的持久化特性
undo log
undo log 叫做回滚日志,用于记录数据被修改前的信息。他正好跟前面所说的重做日志所记录的相反。
每次写入数据或者修改数据之前都会把修改前的信息记录到 undo log。
undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。
mysql锁技术
当有多个请求来读取表中的数据时可以不采取任何操作,但是多个请求里有读请求,又有修改请求时必须有一种措施来进行并发控制。不然很有可能会造成不一致。
解决方式:
- 共享锁(shared lock),又叫做”读锁”
- 排他锁(exclusive lock),又叫做”写锁”
通过读写锁,可以做到读读可以并行,但是不能做到写读,写写并行
事务的隔离性就是根据读写锁来实现的
MVCC
MVCC (MultiVersion Concurrency Control) 叫做多版本并发控制。
InnoDB的 MVCC ,是通过在每行记录的后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期时间,当然存储的并不是实际的时间值,而是系统版本号。
主要实现思想是通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行
MVCC在mysql中的实现依赖的是undo log与read view
- undo log :undo log 中记录某行数据的多个版本的数据。
- read view :用来判断当前版本数据的可见性
- 脏读(读取未提交数据)
- 不可重复读(前后多次读取,数据内容不一致)
- 幻读(前后多次读取,数据总量不一致)
隔离级别
Mysql 隔离级别有以下四种(级别由低到高):
- READ UNCOMMITED (未提交读)
- READ COMMITED (提交读)
- REPEATABLE READ (可重复读)
- SERIALIZABLE (可重复读)
事务实现的思想
事务采取了哪些技术以及思想?
原子性:使用 undo log ,从而达到回滚
持久性:使用 redo log,从而达到故障后恢复
隔离性:使用锁以及MVCC,运用的优化思想有读写分离,读读并行,读写并行
一致性:通过回滚,以及恢复,和在并发环境下的隔离做到一致性。