051.9 操作数据
051.9.5 控制事务
1、事务的概念?
事务是关系数据库范例的一部分,是由一个或者多个DML语句组成,后面紧跟ROLLBACK或者COMMIT命令;
?
2、事务的特性?
ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
?
3、事务原子性的原则?
一个事务的所有部分必须都完成,或都不完成。
?
4、事务一致性的原则?
规定查询的结果必须与数据库在查询开始的时候状态一致。
?
5、事务隔离性的原则?
对于其它部分来说,未完成的(未提交的)事务必须不可见。
?
6、事务持久性的原则?
规定一旦某个事务完成,数据库就不可能丢失这个事务。
?
二、执行SQL语句
1、执行SELECT语句
(1)、服务器进程,是将数据块从数据文件读取至数据缓存区的进程;
(2)、DDWn进程,是将数据块从数据库缓存区写入数据文件的进程;
(3)、SELECT执行过程

步骤<1>:用户进程发出select指令,传输给服务器进程,此时服务器进程将从数据库缓存区中查询是否有所需的select数据,如果
有则则步骤<4>把数据读取到服务器进程,结果集返回到用户进程,返回客户;
步骤<2>:如果查询后数据库缓存区中没有有用的数据,则进入步骤<2>,会到数据文件中查找所需的块;
步骤<3>:步骤<2>结束后,会经历步骤<3>把从数据文件中获取到的数据块复制到数据库缓冲区中;
步骤<4>:步骤<3>后,会经历步骤<4>将数据传输到服务器进程中;
步骤<5>:该步骤会把接收到数据,即查询结果,返回给用户进程;
?
2、执行UPDATE语句
步骤<1>:从缓存拿数据:客户端发出命令语句后,会在数据缓冲区中查找所需的数据块是否存在,如果不存在DML操作会完成将所
需的数据块从数据文件复制至数据块缓冲区。区别于select语句,DML语句还需要某个undo段的一个空数据块;
步骤<2>:放置锁:会在所有记录以及相关索引键上放置锁;
步骤<3>:生成redo:此时服务器进程在日志缓冲区中写入即将应用于指定数据块的变更向量。(redo要在后面应用于“表块”的变
更和“撤销块”的变更)。如果更新某列,该列的rowid和新值以及旧值都会被写入日志缓冲区。如果这列是某索引键的
一部分,那么要应用于该索引的变更以及保护索引变更的撤销块变更也会被写入日志缓冲区;
步骤<4>:在步骤<3>完成后,完成更新操作:在数据缓冲区内完成更新操作。会使用变更后的列更新表数据块,未变更的列则会被
写入撤销段数据块。从这一时刻到提交更新操作的时候,与发生变更的记录相关的其它会话中的所有查询都会被重定向至
undo数据。只有执行更新操作的会话才可以在表数据块中看见更新后的行。同样,所有关联的索引变更步骤也如此这般。
?
3、执行INSERT和DELETE语句
步骤<1>:从缓存拿数据:与update语句管理方式相同。首先都是在数据库缓冲区内查找需要的块,如果不存在,会将数据复制到数
据库缓冲区中;
步骤<2>:生成redo:与update语句管理方式相同。应用于数据块和撤销块的所有变更向量都会首先被写入日志缓冲区。对于
insert,将应用于表块(可能包括索引块)的变更向量是构成新行(可能包括新索引键)的字节。将要应用于撤销块的向
量是新行的rowid。对于delete,要写入到撤销块的变更向量是整个行。
?
insert和delete差异
(1)、insert:插入一条记录时,生成undo的操作只涉及为撤销块写下新的rowid。这是由于回滚insert语句时,oracle只需要
rowid信息,使用如下语句:
SQL> DELETE FROM TABLE_NAME WHERE ROWID = ROWID_OF_THE_ROW ;
这样通过执行上面这条语句就可以撤销原始的更改操作。
?
(2)、delete:删除一条记录时,因为整个行(可能达到数KB)都被写入撤销块,因此,可以通过构建将完整行插入回表的语句,
根据需要回滚这个删除操作。
?
4、事务的开始和结束
(1)、开始与结束
事务开始的时间是从发出DML命令时开始。事务持续执行任何数量的DML命令,直到会话发出COMMIT或者ROLLBACK为终止。只有提交的变更才会变得永久,才会对其他会话可见。不可能嵌套事务。
?
(2)、嵌套事务:指的就是SQL标准不允许用户启动一个事务,然后在终止第一个事务之前再启动另一个事务。使用PL/SQL可以这样做,但这不是SQL行业标准。
?
(3)、显式事务控制:显式事务控制语句有COMMIT、ROLLBACK、SAVEPOINT(可用于取消事务)。
?
(4)、隐式终止事务:发出DDL或者DCL;退出用户工具(SQL*PLUS等);客户会话终止;系统崩溃。
?
(5)、客户会话失败的可能性?
①用户进程终止;②会话在操作系统级别被终止;③数据库服务器的网络连接中断;④运行该客户工具的计算机崩溃。
?
OCP真题演练
171、事务、事务结束
171. Which three statements/commands would cause a transaction to end? (Choose three.)(哪三个语句/命令能导致一个事务结束?选择三个)
A. COMMIT
B. SELECT
C. CREATE
D. ROLLBACK
E. SAVEPOINT
答案:ACD
?
173、事务、事务完成
173. When does a transaction complete? (Choose all that apply.)(什么时候完成一个事务)
A. when a DELETE statement is executed(当DELETE语句被执行后)
B. when a ROLLBACK command is executed(当ROLLBACK语句被执行后)
C. when a PL/SQL anonymous block is executed(当一个PL/SQL anonymous block被执行后)
D. when a data definition language (DDL) statement is executed(当DLL语句被执行后)
E. when a TRUNCATE statement is executed after the pending transaction(在等待的事务之后执行TRUNCATE语句)
答案:BDE
?
definition:定义
pending:未决定的
?
174、事务
174. Which statement is true regarding transactions? (Choose all that apply.)(关于事务哪句话是正确的?选择所有合适的)
A. A transaction can consist only of a set of DML and DDL statements.(一个事务只能由一组DML和DDL语句组成)
B. A part or an entire transaction can be undone by using ROLLBACK command(部分或整个事务可以使用ROLLBACK命令撤销)
C. A transaction consists of a set of DML or DCL statements.(一个事务由一组DML或DCL语句组成)
D. A part or