一、事务和存储过程

  在存储过程中如何使用事务。当需要在存储过程中同时执行多条添加、修改、删除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、自主事务处理可以启动其它自主事务处理。

最新文章

  1. Android keycode列表
  2. 关于dev无法更新、调试的问题
  3. 谁能在同一文件序列化多个对象并随机读写(反序列化)?BinaryFormatter、SoapFormatter、XmlSerializer还是BinaryReader
  4. Bug跟踪方法
  5. 51nod 1113 矩阵快速幂
  6. HDU 2117 取(2堆)石子游戏【wzf博弈】
  7. python eval
  8. BZOJ 2668 交换棋子(费用流)
  9. [SAP ABAP开发技术总结]EXIT-COMMAND
  10. eclipse的设置和优化
  11. Codechef August Challenge 2018 : Interactive Matrix
  12. sql server里中自增长的ID重新开始排
  13. Back up and restore information in Firefox profiles
  14. SQL注入之Sqli-labs系列第四十六关(ORDER BY注入)
  15. Python从入门到精通之Forth!
  16. python3 小工具
  17. Python全栈之路----编程基本情况介绍
  18. HDU ACM 1869 六度分离(Floyd)
  19. Linux/shell: remove adjacent similar patterns
  20. 使用VNC连接管理VPS

热门文章

  1. sqlalchemy多表查询
  2. UVA 10746 Crime Wave - The Sequel
  3. django自定义signal的发送和接收样例
  4. 51nod 1001 数组中和等于K的数对【二分查找/排序】
  5. poj3693(后缀数组)
  6. Spfa【p1186】 玛丽卡
  7. 利用MAP动态创建C++类对象
  8. 使用after伪类,配合IE的zoom或者overflow清除浮动
  9. luogu P1446 [HNOI2008]Cards
  10. [HDU6223]Infinite Fraction Path