oracle 自治事物

//自治事务 //自治事务是"事务中的事务",它独立于父事务提交和回滚,利用自治事务,可以挂起当前事物, //开始一个新事务,完成一些操作,然后提交或者回滚,所有这些事物都不影响当前执行事物的状态。 //它可用于: // ·顶层匿名块 // ·本地(过程中的过程)、独立或打包的函数和过程 // ·对象类型的方法 // ·数据库触发器 //下面我们来看自治事物是如何工作的: create table ta(msg varchar2(30)); create table tb(msg varchar2(30)); //我们建立两个过程,分别向两个表中添加数据: //pragma autonomous_transaction用来标记自治事物,它独立于父事物: create or replace procedure autonomous_insert as pragma autonomous_transaction; begin insert into ta values('autonomous insert'); commit; end; / //普通事物: create or replace procedure nonautonomous_insert as begin insert into tb values('nonautonomous insert'); commit; end; / //下面来看看非自治事物(也就是一般的事物)是如何工作的: begin insert into tb values('some data'); nonautonomous_insert; rollback; end; SQL> select * from tb; MSG ------------------------------ some data nonautonomous insert //从结果我们得知,在上面这个匿名过程中的rollback就像没有工作一样的。 //原因在于,nonautonomous_insert过程中的commit起了作用。 //它提交了调用这个过程之前的所有操作,我们知道oracle的执行过程是从逐条语句执行的, //当碰到错误语句之后,就停止在这里,转而处理错误语句,一般是抛出异常。 //为了保持事物的原子性和一致性,出现异常的事物都要整体回滚; //当顺序执行到某一步时,出现了commit语句,那么就会将此前的所有操作提交; // //如果想要让调用过程中的提交语句独立于主事物,那么必须借助自治事务 //自治事物的工作: begin insert into ta values('some date'); autonomous_insert; rollback; end; SQL> select * from ta; MSG ------------------------------ autonomous insert //在这里,匿名过程中的rollback起作用了,它将主事物中的insert回滚了, //但是在自治事务中提交的操作就不受这个rollback控制了, //这正是我们所说的自治事务独立于主事物的特性. // //如果在非自治事物过程中提交了操作,那么在此commit之前的所有操作都会提交,不能回滚 //如果在自治事物中提交了操作,那么此操作将会影响到该自治事务的所有操作,而不会影响到主事物的操作。  

你可能感兴趣的:(oracle,工作,数据库,Date,table,insert)