今日先初步了解一下事务这块儿的概念。
事务
事务是对数据库进行一致可靠的访问的基本单元,由作为原子单元执行的一系列数据库读写操作、计算步骤组成,可以看作是嵌入数据库访问查询的程序。
start:任意一条DML语句即事务的开启。
commit:成功地结束,将之前记录在内存中的历史操作同步到底层硬盘文件。
abort. rollback:失败地结束,数据库会回退到执行该事务之前的状态。
事务的形式化定义详见参考书。
ACID
事务的四个性质。事务所谓的“一致可靠”,“一致”=一致性+隔离性,“可靠”=原子性+持久性,分别有自己的维护方式(后续再慢慢介绍)。
Atomicity 原子性
事务的所有动作要么全被执行,要么全都不执行。
如果事务在执行过程中被打断,那么DBMS恢复其的方式为:要么继续完成余下操作,要么反做所有已完成的操作,以维护原子性。
由于会遇到两种故障,因此响应的有两类恢复操作:事务恢复、瘫痪恢复。
Consistency 一致性
数据库一致性:服从完整性限制,则数据库处于一致状态。事务执行期间可以暂时不一致。
事务一致性:并发事务时保持一致状态,多个用户同时访问时的数据复制问题。
Isolation 隔离性
在执行过程中的事务不能向其他并发事务透露其执行结果。
保证隔离性的原因:①维护事务之间的一致性;②处理级联式取消。
Durable 持久性
如果已提交,则产生的结果是永久的。
引入数据库恢复的问题,即如何让数据库恢复到所有提交动作所反映的一致状态。
[举例] 关系型数据库事务 “A账户向B账号汇钱”,需要6个操作:
- 从A账号中把余额读出来(500)。
- 对A账号做减法操作(500-100)。
- 把结果写回A账号中(400)。
- 从B账号中把余额读出来(500)。
- 对B账号做加法操作(500+100)。
- 把结果写回B账号中(600)。
原子性:保证1-6所有操作要么都执行,要么都不执行。比如执行到第5步的时候,B账户突然不可用(比如被注销),那么之前的所有操作都应该回滚到执行事务之前的状态。
一致性:在转账之前,A和B的账户中共有500+500=1000元钱。在转账之后,A和B的账户中共有400+600=1000元。
隔离性:如果在A给B转账的同时,有另外一个事务执行了C给B转账的操作,那么当两个事务都结束的时候,B账户里面的钱应该是A转给B的钱加上C转给B的钱再加上自己原有的钱。
持久性:一旦转账成功,两个账户里面的钱就会真的变化且永久。
四个性质是互相依赖而非独立。比如原子性出问题可能导致数据库不一致。
体系架构中的模块
事务管理程序TM
协调各个数据库操作的执行。
每个事务会有个起源站点,起源站点的TM负责所有协调工作,与各个SC和数据处理程序通信。
调度程序SC
通过并发控制算法同步各个操作对数据库的访问。
局部恢复管理程序LRM
在每一个数据库站点中,实现从失败状态恢复到一致状态。
接口由5个命令组成:开始、读、写、提交、取消、恢复。
参考资料:
《分布式数据库系统原理》第三版
未来半年我将系统地学习分布式系统相关知识,通过 经典论文+coding 的形式打好理论基础。以下是我所有的学习笔记。慢慢积累,keep going~
分布式系统学习笔记系列
- Transaction 事务