oracle事务

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对于父事务是独立提交的。

作者:追求完美9196原文地址:https://www.cnblogs.com/study9196/p/18254137

%s 个评论

要回复文章请先登录注册