1. 事务状态及附加操作
事务是工作的一个原子单元,他作为一个整体,要么全都执行,要么全都不执行。
恢复管理器要对下列操作进行跟踪记录:
# BEGIN_TRANSACTION: 标记事务开始执行
# READ 或 WRITE:事务对某个数据项进行读或写操作
# END_TRANSACTION:知名事务的READ或WRITE操作已经结束,标记事务执行结束
# COMMIT_TRANSACTION: 表示事务已经成功结束,事务执行的改变可以安全提交到数据库并且不会被撤销
# ROLLBACK:表示事务没有成功结束,因此必须回滚或撤销该事务对数据库进行的改变或者影响。
2. 系统日志和事务的提交点
假定数据库的永久改变都发生在事务内部,对故障进行恢复的概念实际就是取消或者重新逐个执行日志的的事务操作。如果系统崩溃,可通过检查日志,
使用恢复技术将数据库恢复到某个一致的状态。日志包含了改变数据项值的WRITE操作记录,可通过向后跟踪日志将事务T的WRITE操作所改变的所有项值恢复为old_values,
从而可以取消(undo)事务T的WRITE操作对数据库的影响。如果事务的所有更新操作都记录在日志中,我们确认所有的new_values已经被永久记录在实际数据库之前,事务发生故障,
那么就有可能需要重做(redoing)某些操作。向后追溯日志并将T的WRITE操作所改变的所有项,置为new_values,即可重做事务T的操作
对事务T所有的数据库访问操作都成功执行,并将所有操作对数据库的影响都记录在日志中时,该事务T就到达提交点,提交后的事务就成为已提交的事务。
需要注意的是,必须将日志文件保存在磁盘上。更新一个磁盘文件时必须先将文件相应的块,从磁盘拷贝的主存的缓存区,然后在主存的缓存区进行更新,
最后将缓存区的内容写回磁盘。所以通常的做法是在主存缓存中保留多个日志文件块,直到他们写满再将其一次性写入到磁盘,而不是每增加一个日志条目写一次磁盘。
节省同一日志文件块进行多次磁盘的开销。当系统崩溃时主存中的内容可能丢失,所以恢复时只能考虑已写回磁盘的日志内容。因此,在事务达到提交点之前,
还未写回磁盘的日志内容必须写入磁盘。这称为事务提交前强制写日志
3.事务的描述特性
通常称为ACID特性
原子性:事务是处理的一个原子单位;它或者全部执行或者都不执行
一致性保持:如果事务的执行将数据从一个一致性状态转移到另一个一致性状态,那么该事务是一致性保持。
隔离性:事务的执行表现为与其他事务相互隔离,即事务的执行不应受到其他事务执行的干扰。
持久性或永久性:已提交事务对数据库中应该是持续存在的,这些改变不会因为任何故障而发生丢失
4.SQL中的事务支持
存取方式:可以指定为READ ONLY 或READ WRITE ,默认值是READ WRITE,除非隔离级别READ UNCOMMITTED被指定,此情况下为READ ONLY。
事务隔离级别:事务的隔离级别有 READ UNCOMMITTED,READ COMMITTED REPEATABLE READ或者SERIALIZABLE.
脏读:事务T1可能读到T2更新后的值,但是T2还没有提交。如果T2因故障而被撤销了,那么T1就将读到一个并不存在的错误值 不可重复读:事务T2可能从某个表中读到一个特定值。如果稍后另一个事务T2更新了该值,而T1又读取该值,则T1将读到一个不同的值。
幻读:事务T1可能从某表读取一行数据,该行是基于某个在SQL WHERE 子句中指定的条件。现在假定事务T2在T1用到的表中插入一个新行,他也满足T1使用的WHERE子句的条件
那么如果T被重复执行,它将看到一个幻想,即以前并不存在的行。