事务是数据库管理系统中的一个核心机制,它是一个操作序列,包含了一组数据库操作命令(如SELECT, INSERT, UPDATE, DELETE)。事务将这些命令视为一个不可分割的整体,要么全部成功执行,要么全部不执行。它是数据库进行并发控制和故障恢复的最小逻辑工作单元。
应用场景:特别适用于多用户同时操作、对数据准确性要求极高的系统,例如:
航空公司的订票系统
银行、保险公司
证券交易系统
事务的ACID特性
事务必须满足四个基本特性,即ACID,这是保证数据准确性和可靠性的基石。
1. 原子性 (Atomicity)
核心:事务中的所有操作是一个不可分割的原子单元。所有操作要么全部成功(提交,Commit),要么全部失败(回滚,Rollback)。
比喻:就像化学中的原子,是不可再分的基本单位。
示例:银行转账包含两个操作:从A账户扣款和向B账户加款。原子性确保这两个操作必须同时成功或同时失败。不可能发生A账户钱扣了,B账户没收到的情况。
2. 一致性 (Consistency)
核心:事务的执行必须使数据库从一个一致性状态转换到另一个一致性状态。一致性状态指的是数据必须满足预定义的规则约束(如唯一性约束、外键约束、业务规则等)。
关键:一致性是由应用层和数据库共同维护的。应用层定义业务逻辑(如转账总额不变),数据库层定义完整性约束(如账户余额不能为负)。
示例:转账前后,两个账户的总额必须保持不变。如果事务成功,数据库就从一个总额一致的状态变到了另一个总额一致的状态;如果事务失败,数据库会回滚到事务开始时总额一致的状态。
3. 隔离性 (Isolation)
核心:数据库允许多个事务并发执行,但系统必须确保一个事务的执行不受其他并发事务的干扰。每个事务都感觉不到有其他事务在同时执行。
实现:隔离性通过数据库的锁机制或多版本并发控制(MVCC) 来实现。不同的隔离级别(如读未提交、读已提交、可重复读、序列化)提供了不同强度的隔离保证。
示例:张三给李四转账和王五给赵二转账是两个独立的事务。它们同时执行时,不会相互影响,最终结果与它们顺序执行的结果完全相同。
4. 持久性 (Durability)
核心:一旦事务成功提交(Commit),它对数据库所做的修改就是永久性的,即使随后系统发生任何故障(如断电、崩溃),数据也不会丢失。
实现:持久性通常通过**事务日志**来实现。数据库会先将事务的修改信息写入日志文件,然后再更新内存中的数据页。即使系统在写入数据页前崩溃,数据库在重启后也能通过重放日志文件来恢复已提交的事务。
示例:转账成功后,银行系统确认“交易成功”。即使此时数据库服务器立即断电,重启后你的账户余额也已经是转账后的新金额,而不是转账前的旧金额。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程