关于事务
数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
数据库事务通常包含了一个序列对数据库的读/写操作。包含有以下两个目的:
- 为数据库操作序列提供了一个从失败者中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法;
- 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
例子:某人要在商店使用电子货币购买100元的商品,其中至少包括两个操作——该人账户减少100元 & 商店账户增加100元,这两个操作构成整个事务,支持事务的数据库管理系统(transactional DBMS)就是要确保这两个事务都能完成,或者一起取消,否则就会出现100元凭空消失的情况。
数据库事务拥有ACID特性:
- 原子性(Atomicity)
事务作为一个整体被执行,包含在其中的数据库操作要么全部被执行,要么都不执行。 - 一致性(Consistency)
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。(一致状态的含义时数据中的数据应满足完整性约束) - 隔离性(Isolation)
多个事务并发执行,一个事务的执行不应影响其他事务的执行。 - 持久性(Durability)
已被提交的事务对数据库的修改应该永久地保存在数据库中。
数据库并发事务导致的五大问题
两类更新问题 & 三类读问题
第一类丢失更新
A事务撤销时,把已经提交的B事务的更新数据覆盖了。
第二类丢失更新
A事务提交时,把已经提交的B事务的更新数据覆盖了。
脏读
读到未提交更新的数据。
不可重复读
读到已经提交更新的数据,但一个事务范围内两个相同的查询却返回了不同的数据。
幻读
读到了另一个事务已提交的插入数据。