MySQL的ACID特性
MySQL为保证事务(transaction)是正确可靠的,具备以下四个特性:
原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
一、原子性(Atomicity)
一个事务中的所有操作要么全部成功执行,要么全部失败回滚。就像一个不可分割的原子一样。
例如,在银行转账操作中,从账户 A 向账户 B 转账 100 元,这个事务包含两个操作:从账户 A 扣除 100 元,向账户 B 增加 100 元。如果在执行过程中,向账户 B 增加 100 元的操作失败了,那么整个事务将回滚,账户 A 也不会扣除 100 元。
二、一致性(Consistency)
一致性是指数据库中的数据在任何时候都满足预定的完整性约束条件。也就是说,数据库中的数据必须是正确的、符合业务规则的,并且在所有相关操作执行后仍然保持这种正确性。
例如,在一个银行转账系统中,一致性要求转账操作完成后,转出账户的余额减少的金额必须等于转入账户余额增加的金额,同时相关的账户信息、交易记录等都要准确无误地更新,以反映出这一转账操作的结果,确保数据在整体上是一致的、符合业务逻辑的。
三、隔离性(Isolation)
隔离性是指多个事务并发执行时,每个事务都感觉不到其他事务的存在,就好像在单独执行一样。MySQL 提供了多种隔离级别来控制事务之间的相互影响。
1.读未提交(Read Uncommitted)
定义:一个事务可以读取另一个未提交事务的数据
优点:并发性能最高,因为没有任何锁机制
缺点:会出现脏读问题(读取到其他事务未提交的数据,如果该事务回滚,那么读取到的数据就是无效的)
示例:事务A修改了数据但未提交,事务B此时读取到了事务A修改后的数据,如果事务 A 回滚,事务B 读取到的数据就是脏数据
2.读已提交(Read Committed)
定义:一个事务只能读取另一个已提交事务的数据
优点:解决了脏读问题
缺点:会出现不可重复读问题(在同一个事务内,多次读取同一数据,可能会得到不同的结果,因为在两次读取之间,其他事务可能已经修改并提交了该数据)
示例:事务A第一次读取数据后,事务B修改并提交了该数据,事务A再次读取时,得到的数据和第一次不同
3.可重复读(Repeatable Read)
定义:在同一个事务内,多次读取同一数据,结果始终保持一致,即使其他事务对该数据进行了修改并提交
优点:解决了不可重复读问题
缺点:会出现幻读问题(当一个事务按相同条件多次查询,可能会得到不同数量的记录,因为在两次查询之间,其他事务可能插入或删除了符合条件的记录)
示例:事务A第一次查询符合条件的记录有5条,事务B插入了一条符合条件的记录并提交,事务A再次查询时,得到的记录变为6条
4.串行化(Serializable)
定义:所有事务依次执行,完全串行化,避免了所有并发问题
优点:数据一致性最高
缺点:并发性能最低,因为每个事务都需要等待前一个事务完成才能执行
示例:事务A执行时,事务 B必须等待事务A完成后才能开始执行
四、持久性(Durability)
持久性确保一旦事务被提交,其对数据库所做的更改就会永久保存下来,即使系统发生故障(如停电、系统崩溃等),这些更改也不会丢失。
例如,当用户向数据库中插入一条记录并成功提交后,无论之后发生什么情况,这条记录都应该能够在数据库中被找到,不会因为系统的意外重启或其他故障而消失。