Oracle基础 存储过程和事务

1、事务和存储过程spa

  在存储过程当中如何使用事务。当须要在存储过程当中同时执行多条添加、修改、删除SQL语句时,为了保证数据完整性,咱们须要使用事务。使用方式和在PL-SQL中很是类似,但也有一些区别。  code

--带事务的存储过程
CREATE OR REPLACE PROCEDURE Account_zhuanzhang(fromuser NUMBER,touser NUMBER,money NUMBER) IS
BEGIN
    UPDATE account SET balance = balance - money WHERE id = fromuser;
    UPDATE account SET balance = balance + money WHERE id = touser;
    COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line('转帐失败');
    ROLLBACK;
END Account_zhuanzhang;

调用事务blog

SELECT * FROM ACCOUNT;
DECLARE 
  fromuser NUMBER := 1;
  touser NUMBER := 2;
  money NUMBER := &m;
BEGIN
  account_zhuanzhang(fromuser,touser,money);
END;

 

 

2、自主事务处理:事务

  自主事务:是由零一个事务启动的独立事务处理。自主事务处理能够暂停主事务处理,也就是处理本身存储过程内部的事务,当自主事务处理完以后会恢复主事务处理。class

  PRAGMA AUTONOMOUS_TRANSACTION;  --定义为自主事务,不受其余事务提交,回滚的影响test

  例:配置

--自主事务:带参数添加部门信息,最后使用了回滚
CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD(DEPTNO NUMBER,DNAME VARCHAR2,LOC VARCHAR2) AS
PRAGMA AUTONOMOUS_TRANSACTION;  --定义为自主事务,不受其余事务提交,回滚影响
BEGIN
  INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (DEPTNO, DNAME, LOC);
    ROLLBACK;  --自主事务回滚操做,不影响主事务。
END;
--主事务,添加部门信息,并调用带参数的自主事务,本身自己提交
CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD2 AS
BEGIN
  INSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (60, 'test1', 'test2');
  PRO_DEPT_ADD(70, 'test', 'test');     --若是调用的事务回滚,若是不是自主事务当前存储过程当中插入数据也要一块儿回滚。可是添加了自主事务后,自主事务提交内容不会影响到当前存储过程
  COMMIT;
END;

调用主事务:总结

BEGIN
      pro_dept_add2();  --调用完毕后,为60的部门插入成功,可是为70的部门信息回滚了。只有一条插入成功!
END;

 

  总结自主事务:数据

  一、自主事务处理结果的变化不依赖于主事务处理的状态或最终配置。存储过程

  二、自主事务处理提交或回滚时,不影响主事务处理的结果。

  三、自主事务提交一旦提交,该自主事务处理结果的变化对于其余事务处理就是课件的。这意味着,用于能够访问已更新的信息,无需等待主事务处理提交。

  四、自主事务处理能够启动其它自主事务处理。

相关文章
相关标签/搜索