在日常开发中,我们经常会遇到需要多个数据库操作同时成功或同时失败的场景。比如经典的银行转账问题:
-
从A账户扣减100元。
-
向B账户增加100元。
这两个步骤必须是一个不可分割的整体。如果步骤1成功后系统突然宕机,步骤2没有执行,那100元就凭空消失了,这无疑是灾难性的。
如何保证这些操作的整体性呢?这就是 MySQL事务(Transaction) 大显身手的地方。
一、什么是事务?
事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。简单来说,事务就是一组要么全部成功、要么全部失败的SQL语句。
二、事务的四大核心特性(ACID)
事务的成功,依赖于四个核心特性,即ACID:
A - 原子性(Atomicity): 事务是最小的执行单位,不可再分。事务内的所有操作要么全部成功,要么全部失败回滚。
C - 一致性(Consistency): 事务执行前后,数据库必须从一个一致性状态转换到另一个一致性状态。这意味着事务必须遵循所有预定义的规则(如约束、触发器),不会破坏数据的完整性。转账前后,两个账户的总金额必须保持不变。
I - 隔离性(Isolation): 多个并发事务执行时,一个事务的执行不应影响其他事务。数据库提供了不同的隔离级别来控制这种影响的程度,防止脏读、不可重复读、幻读等问题。
D - 持久性(Durability): 一旦事务提交(Commit),它对数据库所做的更改就是永久性的,即使系统发生故障也不会丢失。
<