? ? ? ? 我们对于MySQL 很熟悉,关于其特性都有一定的了解,但是关于一些具体的实现原理,有的小伙伴可能不太熟悉,而且这部分知识在我们互联网大厂面试中是经常涉及的,因此,本文将带你深入底层,顺利通过面试。
????????原子性是指一个事务是一个不可分割的整体,在一个事务的中的操作,要么全部成功,要么全部失败,保持整体一致。
????????? ?一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的而不是语法上的。 这个状态是满足预定的约束就叫做合法的状态,再通俗一点,这状态是由你自己来定义的。满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!
????????隔离性是指多个事务并发执行的时候,一个事务内部的操作与其他事务是相互隔离的,并发执行的各个事务之间不能互相干扰。
1)、read uncommitted (读未提交):两个事务之间能够相互读取对方的修改未提交的数据(会产生脏读)。
2)、read committed (读已提交):一个事物在操作过程中,能够读取另一个事务已提交的数据(会产生不可重复读)。
3)、Repeatable read(可重复度):在第一次读取操作时生成?ReadView,并且对于记录的更新操作,会对每一条被更新的记录加上next-key锁(等价于行锁+间隙锁)。(会产生幻读)
4)、Serializable(串行化):一个事务一个事务按顺序执行,不会产生任何问题,但是效率低。
# 查看数据库的隔离级别
show variables like '%isolation%' # 在 MySQL 数据库中,默认的事务隔离级别是 REPEATABLE READ
# 设置隔离级别
set session/global transaction isolation level 隔离级别;
????????持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
????????原子性的实现利用 Innodb 的 undo log。 undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。
例如:
1)、当你delete一条数据时,就需要记录这条数据操作信息,回滚的时候,insert这条旧数据。
2)、当你update一条数据时,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作。
3)、当年insert一条数据时,就需要这条记录的主键,回滚的时候,根据主键执行delete操作。
????????undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。
????????从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。
????????隔离性的实现利用的是锁和MVCC机制。MVCC(多版本并发控制:Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。 如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。
注意:在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。
????????当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据 undo log 和 binlog 内容决定回滚数据还是提交数据。
redo log 特点:
1)、redo log体积小,毕竟只记录了哪一页修改了啥(物理记录),因此体积小,刷盘快。
2)、redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。
? ? ? ? 关于二进制文件的详细说明,参考博客:MySQL 和 Redis 如何保证数据一致性,通过MySQL的binlog实现-CSDN博客
?? ? ? ? 本文详细介绍了MySQL的四大特性和隔离级别相关知识,关于如何实现 MVCC 机制敬请关注后续内容更新,以上知识点是我们在面试过程中经常遇到的问题,掌握原理能够让我们更好使用MySQL。
????????本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)