1.MySQL的四个特性(ACID)
InnoDB存储引擎还提供了两种事务日志:redo log(重做日志)和undo log(回滚日志)。其中redo log用于保证事务持久性;undo log则是事务原子性实现的基础。
- 原子性 (Atomicity)
事务是一个原子操作单元,其对数据的修改要么全部执行,要么全不执行。
举例:假设有一个银行转账事务,从账户 A 转 100 元到账户 B。这个转账事务包括两个操作:从账户 A 中扣除 100 元和给账户 B 增加 100 元。这两个操作要么都成功,要么都失败,不可能只执行其中一个。
- 一致性 (Consistency)
事务必须使数据库从一个一致性状态转变到另一个一致性状态。
举例:继续使用上面的银行转账例子,转账前后,两个账户的总金额是不变的。即转账前 A 账户有 500 元,B 账户有 300 元,转账后 A 账户变为 400 元,B 账户变为 400 元,但两者的总和仍然是 800 元。
- 隔离性 (Isolation)
在事务进行和完成期间,事务的中间状态对其他事务是不可见的。
举例:考虑两个并发的转账事务,一个是账户 A 转给账户 B 100 元,另一个是账户 C 转给账户 D 50 元。由于隔离性,这两个事务不会互相干扰。即使它们同时发生,一个事务也不会看到另一个事务的中间状态。
- 持久性 (Durability)
一旦事务完成,则其结果就是永久性的。
举例:继续上面的银行转账例子,假设事务成功地从账户 A 转了 100 元到账户 B,那么即使系统崩溃或重启,这个转账的结果仍然是有效的,不会丢失。
2.mysql底层如何实现ACID
- 原子性和持久性:这两个特性通常是通过事务日志(Redo log 和 Undo log)来实现的。当事务提交时,对应的 Redo log 会被写入磁盘以保证持久性,而 Undo log 则用于回滚和保证原子性。
- 隔离性:在底层,MySQL通过锁机制和多版本并发控制(MVCC)来实现不同隔离级别的事务隔离。
- 一致性:依赖于事务的其它三个属性(原子性、隔离性、持久性)共同保证的,只要事务是原子的、隔离的、持久的,它自然就能保证数据库状态的一致性转换。
总的来说,MySQL 通过使用事务日志、数据库约束、锁机制和多版本并发控制等技术来实现事务的 ACID 特性。这些机制确保了事务的原子性、一致性、隔离性和持久性。
3.MySQL的四种隔离级别
- Read Uncommitted(读未提交