MySQL事务
MySQL事务的四⼤特性说⼀下?
事务是一条或者多条语句组成的执行单元
原子性,一致性,持久性和隔离性
原子性
原子性保证了事务中的操作要么全部执行完成,要么全部不完成,为不可分割的的单位
如果失败了就会会到原来的状态
一致性
一致性确保事务从一个一致的状态转换到另一个一致的状态
⼀致性与业务规则有关,⽐如银⾏转账,不论事务成功还是失败,转账双⽅的总⾦额应该是不变的
隔离性
隔离性意味着并发的事务是彼此独立的,,互不干扰
持久性
持久性确保事务⼀旦提交,它对数据所做的更改就是永久性的,即使系统发⽣崩溃,数据也能恢复到最近⼀次提交的状态
ACID 靠什么保证的呢?
详细说说如何保证原⼦性?
ACID 中的原⼦性主要通过 Undo Log 来实现,持久性通过 Redo Log 来实现,隔离性由 MVCC 和锁机制来实现,⼀致性则由其他三⼤特性共同保证
事务对数据进⾏修改前,会记录⼀份快照到 Undo Log,如果事务中有任何⼀步执⾏失败,系统会读取 Undo Log将所有操作回滚,恢复到事务开始前的状态,从⽽保证事务要么全部成功,要么全部失败
详细说说如何保证隔离性?
隔离性主要通过锁机制和 MVCC 来实现
⽐如说⼀个事务正在修改某条数据时, MySQL 会通过临键锁来防⽌其他事务同时进⾏修改,避免数据冲突
MVCC 主要⽤来优化读操作,通过保存数据的历史版本,让读操作不需要加锁就能直接读取快照,提⾼读的并发性
详细说说如何保证持久性?
MySQL 的持久性主要由预写 Redo Log、双写机制、两阶段提交以及 Checkpoint 刷盘机制共同保证
当事务提交时, MySQL 会先将事务的修改操作写⼊ Redo Log,并强制刷盘,然后再将内存中的数据⻚刷⼊磁盘。这样即使系统崩溃,重启后也能通过 Redo Log 重放恢复数据。
为了解决只写⼊部分的问题, MySQL 采⽤了双写机制,脏盘刷⻚时,先将数据⻚写⼊到⼀个双写缓冲区中, 2M的连续空间,然后再将其写⼊到磁盘的实际位置
崩溃恢复时,如果发现数据⻚不完整,会从双写缓冲区中恢复副本,确保数据⻚的完整性。
在涉及主从复制时, MySQL 通过两阶段提交保证 Redo Log 和 Binlog 的⼀致性:第⼀阶段,写⼊ Redo Log 并标记为 prepare 状态;第⼆阶段,写⼊ Binlog 再提交 Redo Log 为 commit 状态
崩溃恢复时,如果发现 Redo Log 是 prepare 但 Binlog 完整,则会提交事务;反之会回滚,避免主从不⼀致
事务的隔离级别有哪些?
隔离级别定义了⼀个事务可能受其他事务影响的程度, MySQL ⽀持四种隔离级别,分别是:读未提交、读已提交、可重复读和串⾏化。