事务是恢复和并发控制的基本单位。
在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。
一个程序通常包含多个事务。
事务正常结束
提交事务的所有操作(读+更新)
事务中所有对数据库的更新写回到磁盘上的物理数据库中
事务异常终止
事务运行的过程中发生了故障,不能继续执行
系统将事务中对数据库的所有已完成的操作全部撤销
事务滚回到开始时的状态
恢复系统保证原子性和持久性。
并发控制系统保证隔离性和一致性。
事务中包含的所有操作要么全做,要么全不做。
原子性由恢复系统实现。
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
事务开始前,数据库处于一致性的状态;事务结束后,数据库必须仍处于一致性状态;事务的执行过程中可以暂时的不一致。
数据库的一致性状态由用户来负责,由并发控制系统实现。
如银行转账,转账前后两个帐户金额之和应保持不变。
两种状态:
一致性状态
数据库中只包含成功事务提交的结果。
不一致状态
数据库系统运行中发生故障,有些事务尚未完成就被迫中断;
这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态 。
系统必须保证事务不受其它并发执行事务的影响。
对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。
隔离性通过并发控制系统实现。
一个事务一旦提交之后,它对数据库的影响必须是永久的。系统发生故障不能改变事务的持久性。
持久性通过恢复系统实现。
由于并发操作破坏了事务的隔离性。
两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失。
不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
后两种不可重复读有时也称为幻影现象(Phantom Row)
读“脏”数据是指:
事务T1修改某一数据,并将其写回磁盘
事务T2读取同一数据后,T1由于某种原因被撤销
这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致
T2读到的数据就为“脏”数据,即不正确的数据 。
以下部分内容来自于 数据库系统概念
允许读取未提交数据。
(当事务A更新某条数据时,不容许其他事务来更新该数据,但可以读取。)
只允许读取已提交数据,但不要求可重复读。
(当事务A更新某条数据时,不容许其他事务进行任何操作包括读取,但事务A读取时,其他事务可以进行读取、更新。)
只允许读取已提交数据,而且一个事务两次读取一个数据项期间,其他事务不得更新该数据,但是该事务不要求与其他事务可串行化。
保证可串行化调度。
以上所有隔离级别都不允许脏写,即如果一个数据项已经被另外一个尚未提交的事务写入,则不允许对该数据项执行写操作。
下面主要是封锁机制:
封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
基本封锁类型
“两段”锁的含义
事务分为两个阶段:
事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。
事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。
封锁对象的大小称为封锁粒度(Granularity)
封锁的对象为逻辑单元,物理单元 。
在关系数据库中,封锁对象:
逻辑单元: 属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等。
物理单元:页(数据页或索引页)、物理记录等。
封锁粒度与系统的并发度和并发控制的开销密切相关。