事务(Transaction)是由一组数据库操作序列组成的逻辑单元,这些操作要么全部成功执行(提交),要么全部无效(回滚)。核心目标是保证数据从一种一致状态转换到另一种一致状态。
“事务”(Transaction)作为数据库中的概念,最早是在 20世纪70年代 随着数据库管理系统(DBMS)的发展逐步明确提出的,尤其是在关系型数据库理论建立之后。
1970年:IBM 的 E.F. Codd 发表著名论文《A Relational Model of Data for Large Shared Data Banks》。
该论文确立了关系数据库的基本理论,为事务概念的提出打下基础。
IBM 在开发其关系数据库系统 System R(1974~1977) 时,首次 系统性地提出了“事务”概念和ACID模型的雏形。
事务是为了支持并发处理、系统崩溃恢复而引入的,用于保证数据库的正确性和稳定性。
Jim Gray(图灵奖得主)在其研究中正式提出并定义了事务的四大核心特性:ACID(Atomicity, Consistency, Isolation, Durability)。
他的贡献是事务理论正式确立和工业化应用的关键。
这是理解事务的核心:
特性 | 英文 | 含义 |
---|---|---|
原子性 | Atomicity | 事务中的所有操作要么全部执行,要么全部不执行。 |
一致性 | Consistency | 事务执行前后,数据必须保持一致(满足所有规则和约束)。 |
隔离性 | Isolation | 并发执行的事务互不干扰。 |
持久性 | Durability | 事务提交后,对数据库的更改是永久性的,即使系统崩溃也不会丢失。 |
命令 | 作用 |
---|---|
BEGIN 或 START TRANSACTION |
开始事务 |
COMMIT |
提交事务 |
ROLLBACK |
回滚事务 |
SAVEPOINT |
设置回滚点 |
SET TRANSACTION |
设置事务的隔离级别等 |
为了平衡性能和数据一致性,数据库定义了不同的隔离级别,解决并发事务可能导致的问题(如脏读、不可重复读、幻读)。常见的隔离级别包括:
并发执行事务可能引发以下问题:
数据库通过以下机制支持事务:
SQL标准定义了4种隔离级别(控制严格度递增):
隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现机制 |
---|---|---|---|---|
READ UNCOMMITTED | ✗ | ✗ | ✗ | 无锁(实际极少使用) |
READ COMMITTED | ✓ | ✗ | ✗ | 语句级快照(如Oracle/PostgreSQL默认) |
REPEATABLE READ | ✓ | ✓ | ✗ | 事务级快照(MySQL InnoDB默认) |
SERIALIZABLE | ✓ | ✓ | ✓ | 强制事务串行执行 |
场景 | 原因 |
---|---|
银行转账 | 要么两边账户都更新成功,要么都失败,不能只扣款不入账。 |
订单处理系统 | 下单时库存减少、订单记录生成、支付状态变更必须一致。 |
库存管理 | 商品出库和库存变更必须配套,避免重复发货或数据错乱。 |
日志写入 + 数据变更 | 数据更新和操作记录必须同时成功,否则就要全部撤销。 |
我想等网站访问量多了,在这个位置放个广告。网站纯公益,但是用爱发电服务器也要钱啊 ----------狂奔的小蜗牛