MySQL事务的四个特征(ACID)以及隔离级别

本文详细介绍了MySQL的ACID特性,包括原子性、一致性、隔离性和持久性,并通过事务日志和锁机制阐述了其实现方式。接着讨论了MySQL的四种隔离级别及其可能导致的问题,如脏读、不可重复读和幻读。此外,还解释了MVCC在读已提交和可重复读隔离级别中的作用,以及为何读已提交存在不可重复读问题。最后,提到了InnoDB存储引擎中的锁机制和间隙锁在解决幻读和死锁问题上的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(读未提交࿰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值