1 事务的概念

事务是将数据库从一种一致性状态转变为另外一种一致性状态

2 事务的四个特征(ACID)

  • 原子性(Atomicity):事务的所有执行要么一起成功,要么一起失败
  • 一致性(Consistency):事务将数据从一种一致性状态转为另外一种一致性状态
  • 隔离性(Isolation):事务中所有修改未提交的数据对其他事务是不可见的
  • 持久性(Durability):事务一旦提交,数据就永久保存

2.1 DDL与原子性

DDL语句执行之前,会先自动执行一个commit,再执行DDL语句本身。

2.2 COMMIT_WAIT与持久性

oracle的持久性是依靠redo来保证的。一般情况下,commit执行时,只有数据对应的redo缓存写入到redo在线重做日志后,才会给客户端返回commit成功的信息。
COMMIT_WAIT参数有三个值WAIT、NOWAIT和FORCE_WAIT。当COMMIT_WAIT设置为NOWAIT时,commit执行时数据库无需等待redo缓存写入到redo在线重做日志,直接给客户端返回commit成功的信息。但是,这样子做,无法保证数据的持久性。因为此时commit成功,redo缓存并没有写入到redo在线重做日志。如果此时数据库突然关闭,这次修改的数据无法通过redo进行恢复。

3 分布式事务

有时候,我们会使用DBLINK联合其他服务器上的oracle数据库执行一个事务。这种分布式事务,oracle是通过2PC(Two-Phase Commit Protocol,两阶段提交协议)实现事务的原子性的。2PC原理是oracle在处理分布式事务时,会指定一个数据库作为协调者,这个协调者在提交事务时,会询问各个数据库是否做好提交。如果每个数据库都回复确定提交,协调者告诉各个数据库进行提交。如果其他数据库有回复不可以提交,则协调者会让各个数据库进行回滚。

4 自治事务

当一个事务为自治事务时,这个事务的提交和回滚都不会影响父事务。例如,我们有如下一个自治事务的存储过程(使用pragma autonomous_transaction声明)

create or replace procedure Autonomous_Insert as
  pragma autonomous_transaction;
begin
  insert into bk_test values (2);
  commit;
end;

我们执行如下SQL

begin
insert into bk_test values(1);
Autonomous_Insert;
rollback;
end;

查询结果

可见,刚才那段sql最后一个rollback,只回滚了数据为1的数据。Autonomous_Insert中的commit成功插入了数据2,却没有将父事务中的数据1进行commit。可见,Autonomous_Insert中的commit对于父事务是独立提交的。

5 事务过程中oracle实例的变化

  1. 事务开始
  2. 在共享池中查找对应的已经编译过的执行计划。如果没有找到,则生成执行计划
  3. 在数据库高速缓存中查找对应的数据块,如果没有找到,就从数据文件中读取对应的数据块,加载到数据库高速缓存中
  4. 在数据库高速缓存中修改对应的数据块,这些块就变成了脏块。同时在redo缓存中生成redo日志
  5. 当事务提交时,等待redo缓存中的对应的redo日志全部写入到在线重做日志文件,写入完成后返回提交成功信息
  6. 当发生checkpoint时,DBWn进程会将对应的脏块写入到数据文件中。写入后CKPT进程更新数据文件和控制文件中的SCN信息
posted on 2024-06-19 15:16  追求完美9196  阅读(20)  评论(0编辑  收藏  举报