事务基本概念
- 事务是一系列的数据库操作,是数据库应用程序的基本逻辑单位,即应用程序对数据库的操作都应该以事务的方式进行
- 事务是一个操作序列,这些操作“要么全都做,要么全都不做”,是数据库环境中不可分割的逻辑单位
- 事务四个特性:
1)原子性:事务的所有操作在数据库中要么全做要么全都不做
2)一致性:一个事务独立执行的结果,将保持数据的一致性,即数据不会因为事务的执行而遭受破坏
3)隔离性:一个事务的执行不能被其他事务干扰。并发事务在执行过程中可能会对同一数据进行操作,这些事务的操作应该不会互相干扰,是相互隔离的
4)持久性:一个事务一旦提交,它对数据库的改变必须是永久的,即使系统出现故障时也是如此 -
事务的五种状态:
1)活动状态:事务的初始状态,事务执行时处于这个状态
2)部分提交状态:部分提交状态:当操作序列的最后一条语句自动执行后,事务处于部分提交状态这时,事务虽然已经完全执行,但由于实际输出可能还临时驻留在内存中,在事务成功完成前仍有可能出现硬件故障,事务仍有可能不得不中止。因此,部分提交状态并不等于事务成功执行。
3)失败状态:由于硬件或逻辑等错误,使得事务不能继续正常执行,事务就进入了失败状态。处于失败状态的事务必须进行回滚(ROLLBACK)。这样,事务就进入了中止状态。
4)中止状态:事务回滚并且数据库恢复到事务开始执行前的状态。
5)提交状态:当事务成功完成后,称事务处于提交状态。只有事务处于提交状态后,才能说事务已经提交。
- 事务进入中止状态后,系统一般有如下两种选择:
1)重启事务:当事务中止的原因是软、硬件错误而不是事务内部逻辑错误时,一般采用重启事务的方法。重启事务可以被看成一个新事物
2)杀死事务:这样做通常是因为事务中止的原因是事务内部的逻辑错误,或者是输入错误,也可能是所需数据在数据库中没找到等原因
数据库的并发控制
- 并发操作带来的数据不一致性有三类:丢失修改、不可重复读、读脏数据
- 排它锁:也称为写锁,对数据进行写操作时进行锁定,只允许对数据加锁的事务进行读取与修改,其他事务不可读也不可改。
- 共享锁:也成为读锁,用于对数据进行读操作时锁定,对数据进行加锁操作的事务只允许读取不允许修改,其他事务可以对该数据进行加共享锁操作,不能进行加排他锁
- 封锁协议:
1)一级锁协议:事务T在修改数据A之前必须对A加X(排他)锁,直至事务结束才能释放X锁。
2)二级锁协议:是一级锁协议记上事务T在读取数据A之前必须对其加上S锁,读完之后即可释放S锁。但释放后有其他事务对A进行修改,事务T再次读取A时,就会出现不可重复读的错误。
3)三级所协议:是一级锁协议上加上事务T读取A之前必须对A加上S锁,直到事务结束才释放S锁,解决不可重复读的问题。
一级可以防止:丢失修改
二级可以防止:丢失修改和脏读
三级可以防止:丢失修改、脏读、不可重复读
- 两段锁:是指对任何数据进行读写之前都必须对数据进行加锁,在释放一个封锁前,事务不在申请和获得任何其他封锁。两段锁的含义是指食物分为两个阶段,第一级阶段是获取锁,第二个阶段是释放锁。
- 两段锁协议与可串行化:如果事务遵循两段锁协议,那么他们的并发调度是可串行化的。
数据库的备份恢复
数据库备份
- 数据备份:数据转储时将数据库自制到另一个磁盘或者磁带上保存的过程
1)静态转存:转储期间不允许对数据库进行任何存取、修改操作
2)动态转存:转储期间允许对数据库进行存取、修改操作,因此转储和用户事务可并发执行
3)海量转存:指每次转储全部数据
4)增量转存:每次只转储上次转储后更新过的数据
5)日志文件:在事务处理的过程中,DBMS把事务开始、事务结束以及对数据库的插入、删除和修改的每一次操作写入日志文件,每条记录主要内容包括执行操作的事务标识、操作类型、更新前的数据旧值、更新后的数据值、更新日期和时间。一旦发生故障,数据库的恢复子系统可以利用日志文件撤销食物对数据库的改变,回退到事务的初识状态。
6)数据库镜像:为了避免磁盘介质出现故障影响数据库的可用性,许多DBMS提供数据库镜像功能用于数据库恢复。
数据库恢复
- 数据恢复的基本原理是冗余
- 故障恢复的两个操作
1)撤销事务(UNDO):将未完成的事务撤销,使数据库恢复到事务执行前的正确状态
撤销事务的过程:
1)由后往前扫描找到未完成的事务日志,查找事务的更新操作
2)对该事务的更新操作执行逆操作,用日志文件记录中更新前的值写入数据库,插入的记录从数据库中删除,删除的记录重新插入数据库,
3)继续反向扫描日志文件,查找该事务的其他更新操作,并执行逆操作直至事务开始标识
2)重做事务(REDO):将已提交的事务重新执行
重做事务的过程:
从事务的开始标识起,正向扫描日志文件,重新执行日志文件登记的该事务的所有对数据库的操作,直至事务结束标记
对于不同的故障,采用不同的恢复策略:
事务故障的恢复:
1)事务故障定义(事务异常终止):由于程序执行错误而引起食物非预期、异常终止的事务。常见为逻辑错误,如非法输入、找不到数据、溢出等;系统错误,系统进入不良状态如死锁导致事务无法执行。事务故障主要靠数据库自己进行故障恢复,要在不影响其他事务运行情况下,强行回滚该事务,这类恢复操作成为事务撤销(UNDO)。
2)事务故障恢复:事务故障是事务执行到至终点前异常结束,日志文件中只有开始标识,因此需要执行撤销事务操作进行恢复。事务故障的恢复是由系统自动完成的,对用户透明。
步骤1:反向扫描日志文件(即从最后向前扫描日志文件),查找该事务的更新操作
步骤2:对事务的更新操作执行逆操作
步骤3:继续反向扫描日志文件,查找该事务的其他更新操作,并做同样的处理,直到食物的开始标志系统故障(内存中数据丢失)的恢复:
1)系统故障的定义:指硬件、软件的漏洞影响,导致丢失内存中的信息,影响正在执行的事务,但并未破坏外存上的信息,这种成为故障-停止假设(fail-stop assumption)。系统故障终止了事务的执行过程,破坏了事务的原子性,由于缓冲中的部分数据可能已经写入数据库,系统重启后数据库可能处于不一致状态
2)系统故障恢复:系统故障的原因有两个,一是未完成的事务对数据库的更新可能已经写入数据库,而是已提交的事务对数据库的更新可能还在缓冲区中未写入数据库,因此需要对未完成的事务执行撤销事务操作,重做已提交事务介质故障的恢复:
1)介质故障定义:指数据库的存储介质发生故障,如磁盘损坏、瞬间强磁场干扰等,这种故障直接破坏了数据库,会影响所有正在读取这部分数据的事务。
2)介质故障恢复:介质故障时数据库遭到破坏,需要重装数据库,装载故障前最近一次的备份和故障前的日志文件副本,在按照系统故障的恢复过程执行撤销和重做来恢复。