事物—指的是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
ACID性质
原子性—事物作为一个整体,它的所有动作要么全部执行,要么由于出错都不执行。
持久性—已被提交的事物对数据库的修改永久保存在数据库中。
一致性—事物应确保数据库的状态从一个一致状态转变为另一个一致状态。(一致状态的含义是数据库中的数据应该满足完整性约束)
隔离性—多个事物并发执行时,一个事物的执行不应该影响其它事物的执行。
事物的状态
- 活动的:初始状态,事物执行时处于这个状态。
- 部分提交的:最后一条语句执行后。
- 失败的:发现正常的执行不能继续后。
- 终止的:事务回滚并且数据库已恢复到事物开始执行前的状态后。
- 提交的:成功完成后。
事物状态图
说明:事物从活动状态开始。事物完成它的最后一条语句后就进入了部分提交状态。此时,事物已经完成执行,但由于实际输出可能仍临时驻留在主内存中,因此事物仍有可能不得不中止。
系统判定事物不能继续正常执行后,事物就进入失败状态,这种事物必须回滚,这样事物就进入了终止状态。此刻,系统有两种选择:
重启事物,但仅当引起事物终止的硬件错误或不是由事物的内部逻辑所产生的软件错误时。(重启后的事物被看作是一个新事物)
杀死事物,这样做通常是由于事物的内部逻辑造成的错误,只有重写应用程序才能改正,或者由于输入错误,或所需数据在数据库中没有找到。
系统通过并发控制机制保证事物的隔离性,即一个事物的执行不影响其他事物的执行。
并发的优点:
- 提高吞吐量和资源利用率
- 减少等待时间
- 事物调度—即事物的执行顺序
- 串行调度
- 并发调度
确保可串行化可能会迫使一个事物等待另一个事物,或者在某些情况下,由于该事物无法作为可串行化执行的一部分而被迫终止。
隔离性级别的实现
- 事物锁—一个事物可以封锁其访问的数据项,而不用封锁整个数据库
- 共享锁
- 排他锁
共享锁用于事物读的数据项;排他锁用于事物写的数据项;
实际上,通常只有当事物完成所有操作并且提交或终止时才释放锁
- 时间戳
对于每个数据项,系统维护两个时间戳。
数据项的读时间戳记录读该数据项的事物的最大(即最近的)时间戳;
数据项的写时间戳记录写入该数据项当前值的事物的时间戳;
- 快照隔离
快照隔离可以保证读数据的尝试永远无需等待