MySQL 事务具有以下四大特性:

  1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不能只执行其中一部分操作。
  2. 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏,数据总是从一个一致性状态转移到另一个一致性状态。例如,如果一个事务要求将某个账户的金额从 A 转移到 B,那么无论事务是否成功,最终账户 A 和账户 B 的总金额应该保持不变。
  3. 隔离性(Isolation):事务之间是相互隔离的,每个事务对其他事务的操作是透明的,一个事务的中间结果对其他事务是不可见的。隔离性可以防止并发执行的事务之间产生脏读、不可重复读和幻读等问题。
  4. 持久性(Durability):事务完成后,对数据库的修改将永久保存在数据库中,即使系统故障也不会丢失。

事务四大特性是为了保证数据库的数据一致性和可靠性的,使得数据库在并发访问和故障恢复等复杂环境下,仍能保持数据的完整性。

这些特性对于许多应用场景,尤其是需要处理关键业务数据的应用,是非常重要的。例如在转账业务中,它分为两个关键性操作,首先是先扣除一个账户的钱,其次再给另一个账号增加钱。但是如果没有事务的保证,那么有可能第一次操作钱被扣了,但另一个账户钱没增加,那么这笔钱就凭空“消失”了。

什么是一致性?

比如你正在玩一款多人在线游戏,这个游戏需要在不同的玩家之间进行数据传输,比如玩家位置、游戏状态等。为了保证游戏的公平性和可玩性,游戏服务器需要确保所有玩家看到的游戏状态都是一致的,即任何一个玩家对游戏状态的修改,都必须在其他玩家看到之前同步到游戏服务器和其他玩家的终端。 在这个例子中,如果游戏服务器在处理数据时出现了错误,导致某个玩家看到的游戏状态与其他玩家不一致,就会破坏游戏的公平性和可玩性。因此,在多人在线游戏中,一致性是非常重要的。在数据库系统中,也是类似的,保证数据的一致性是数据库系统的一个基本目标。

如何保证事务的四大特性?

以默认的引擎 InnoDB 为例,它保证四大特性的手段分别是:

  1. 原子性是通过 undo log(回滚日志) 来保证的,InnoDB 使用日志(undo log)来记录事务的操作,包括事务开始、修改数据和事务提交等。如果事务执行失败或回滚,InnoDB 可以使用日志来撤销已经执行的操作,确保事务的原子性。
  2. 持久性是通过 redo log (重做日志)来保证的,在事务提交之前,InnoDB 会将事务的修改操作先写入事务日志(redo log),然后再将数据写入磁盘。即使在系统崩溃或断电的情况下,InnoDB 可以通过重放事务日志来恢复数据,确保事务的持久性。
  3. 隔离性是通过 MVCC(多版本并发控制) 和锁机制来保证的。
  4. 一致性是通过各种约束,如主键、外键、唯一性约束等,加上事务的持久性、原子性和隔离性来保证的。