zoukankan      html  css  js  c++  java
  • Oracle基础 存储过程和事务

    一、事务和存储过程

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

    --带事务的存储过程
    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;

    调用事务

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

    二、自主事务处理:

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

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

      例:

    --自主事务:带参数添加部门信息,最后使用了回滚
    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;

      总结自主事务:

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

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

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

      4、自主事务处理可以启动其它自主事务处理。

  • 相关阅读:
    遍历Newtonsoft.Json.Linq.JObject
    JSON中JObject和JArray,JValue序列化(Linq)
    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列
    RabbitMQ学习系列三:.net 环境下 C#代码订阅 RabbitMQ 消息并处理
    RabbitMQ学习系列一:windows下安装RabbitMQ服务
    红帽企业版Linux成为Linux下的.NET Core的参考平台
    LINUX下SYN FLOOD攻击及LINUX下SYN攻防简述
    Linux下tar命令的各种参数选项和他们的作用整理
    异常值监测的方法 Tukey test
    Git如何回滚代码?
  • 原文地址:https://www.cnblogs.com/zhengcheng/p/4217531.html
Copyright © 2011-2022 走看看