事务与数据库恢复原理
数据存储的逻辑单位是数据块,数据操作的逻辑单位是事务。
事务是用户定义的一组操作序列,有一条或多条相关SQL语句组成,是数据库应用程序的基本逻辑单位。事务管理技术主要包括数据库的恢复技术和并发控制技术。
事务的处理逻辑过程
1、 服务器进程捡取该事务的SQL语句,然后检查共享池,查看是否包含该SQL语句的共享SQL区。
2、 如有,则检查该用户是否有访问所涉及的数据的权限,如有,则使用共享SQL区处理该SQL语句。如果没有找到共享SQL区,则分配一个新的SQL区,以便分析、处理该SQL语句。如果无权限,则返回提示权限不足。
3、 锁定该SQL语句所涉及的操作对象;
4、 服务器进程在SGA中操作数据,或从数据文件中奖数据读入到SGA中然后操作数据。
5、 在适当的时候,LGWR后台进程将语句缓冲的重做日志写入到联机重做日志文件中,DBWR后台进程将数据高速缓存中的被修改过的数据块写入到数据文件中。
6、 为该事务产生一个递增的SCN。SCN被写入到控制文件、数据文件的头部、数据块的头部、重做记录中。SCN确定数据库在某个时间点的一致性状态,用来进行并发控制、数据库的恢复。
7、 LGWR后台进程将所有剩余的、已经缓冲的重做日志和当前的SCN写入到联机重做日志文件中。
8、 释放该事务中各个SQL语句所占用的系统资源,并解除对所涉及的操作对象的锁定;
9、 如果事务是成功的,返回成功提示,否则返回错误提示;
10、 在某个恰当的时候,DBWR后台进程将仍然保留在数据高速缓存中的被更改过的数据块(脏数据块)写入到数据文件中。
事务控制的基本语句及功能
1、 提交事务 (commit)
2、 回滚事务 (rollback)
3、 设置保存点 (savepoint)
4、 回退到保存点 (rolbackto savepoint)
5、 设置事务的属性 (settransaction)
6、 设置可延迟约束的检验时机 (setconstrants)
事务提交执行的任务:
1、 为该事务自动产生一个递增的SCN。
2、 LGWR后台进程将所有剩余的已缓冲的重做日志和当前的SCN写入到联机重做日志文件中。
3、 释放该事务中各个SQL语句所占有的系统资源,并解除对所涉及的对象上的锁定。
4、 给用户返回相对应的提示代码信息。
5、 将该事务标记为已完成。
6、 在某个合适的时候,DBWR后台进程将仍然保留在数据高速缓存中的被更改的数据块写入到数据文件中。
事务回退执行的任务:
1、 撤销所有已执行的更改。即从生成的UNDO信息里读取。如果插入则执行删除操作,如果是删除就执行插入操作。如果是更改,就更改成原来的数据。
2、 释放该事务中各个SQL语句所占用的系统资源,并解除对所涉及的操作对象上的锁定。
3、 给用户返回相应的提示代码信息。
4、 将该事务标记为已完成。
保存点
保存点是一个事务中某些中间标志,它可以将一个大的事务划分成几个短小的部分。这样就可以实现部分事务的回退操作。
部分事务回退
由于有了保存点就可以实现部分事务回退。语法:
ROLLBACK TO SAVEPOINT spname 或 ROLLBACK TO spname;
进行部分事务回退操作执行的任务:
1、 撤销保存点之后所有语句执行的更改,但保留保存点之前的更改。
2、 释放保存点之后各个SQL语句所占用的系统资源,并解除对所涉及的操作对象上的锁定,但保留保存点之前各个SQL语句所占用的系统资源和对所涉及的操作对象的锁定。
3、 给用户返回一个回退到保存点的成功提示代码信息。
4、 用户可以继续执行当前的事务。
事务的属性
1、读写;SET TRANSACTION READ WRITE 即事务的默认设置;
2、只读; SET TRANSACTIONREAD ONLY;
该状态下执行: SELECT、LOCKTABLE、SET ROLE、 ALTER SYSTEM/SESSION;
3、隔离级别
A、读已提交: SET TRANSACTION ISOLATIONLEVEL READ COMMITTED
即事务中每个DML语句所操作的数据,是在该语句开始之前已经提交了的数据。它提供语句级的度一致性。该隔离等级下不会出现脏读,但是可能会产生不可重复读和幻像读的现象(因为在该隔离等级下ORACLE并不会禁止其他事务对当前事务所操作的数据进行操作(增、删、改))。是默认的隔离等级。
B、串行化: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
即事务中的每个DML语句所操作的数据,是在该事务开始之前语句提交了的数据,并且可以执行DML语句来更改数据库中的数据,还可以查看到更改的结果。在该隔离等级下不会发生脏读、不可重复读和幻像现象(READ ONLY也一样不会发生脏读、不可重复读、幻像)。它提供事务级的度一致性。
可延迟约束的检验时机
可以使用SET CONSTRAINTS语句为一个事务所涉及到的可延迟约束指定检验的时机。
语法:
SETCONSTRAINTS { constraint_name1 [,constraint_name2 ]…| ALL}
{IMMEDIATE| DEFERRED };
IMMEDIATE 表示在每条DML语句之后就立即校验;
DEFERRED 表示在提交事务的时候才校验;
事务的状态及性质
一个事务从开始到结束经历的不同状态有:
事务初态、活动状态、失败状态、中止状态、提交状态。
4大特性:
1、 原子性 (Atomicity)
即事务是一个不可分割的逻辑单位,一个事务中的所有操作要么成功要么失败。
2、 一致性 (Consistency)
即一个语句、一个事务操作后的结果必须要使数据库中的所有数据处于一种逻辑上的一致性状态。
3、 隔离性 (Isolation)
即一个事务的执行,不能受到其他事务的干扰。也即一个事务内部的操作与使用的数据对其他事务是隔离性的,并发执行的各个事务之间不能够相互干扰。在提交之前只有该事务的用户才可看到正在修改的数据,而其他事务的用户只能看到修改之前的数据。
隔离性解决了:
脏读(一个事务读取到了另一个事务中的、还没有提交的、更改过的数据);
不可重复读(当一个事务读取了某些数据后,另一个事务修改了这些数据并进行了提交。当再次读取这些数据时,发现这些数据被修改了。)
幻向 (当一个事务读取了某些数据后,另一个事务又插入或删除了符合查询条件的某些行,当再次查询时发现符合查询条件的记录多了或少了。)
4、 持久性 (Durability)
即一个事务一旦提交成功,它对数据库中的数据所做的修改也就永久性的保存下来了。
ORACLE 是利用保存在撤销段中的信息为语句或事务提供对一致性视图。在撤销段中保存了所有未提交的事务和最近提交的事务修改之前的数据即“前映像”。