Oracle 存储过程 中如何使用事务Transaction 自主事务 自治事务
Oracle基础 存储过程和事务
一、事务和存储过程
在存储过程中如何使用事务。当需要在存储过程中同时执行多条添加、修改、删除SQL语句时,为了保证数据完整性,我们需要使用事务。使用方式和在PL-SQL中非常相似,但也有一些区别。
--带事务的存储过程
CREATE OR REPLACE PROCEDURE Account_zhuanzhang(fromuser NUMBER,touser NUMBER,money NUMBER) IS
BEGINUPDATE account SET balance = balance - money WHERE id = fromuser;UPDATE account SET balance = balance + money WHERE id = touser;COMMIT;
EXCEPTIONWHEN OTHERS THENdbms_output.put_line('转账失败');ROLLBACK;
END Account_zhuanzhang;
调用事务
SELECT * FROM ACCOUNT;
DECLARE fromuser NUMBER := 1;touser NUMBER := 2;money NUMBER := &m;
BEGINaccount_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; --定义为自主事务,不受其他事务提交,回滚影响
BEGININSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (DEPTNO, DNAME, LOC);ROLLBACK; --自主事务回滚操作,不影响主事务。
END;
--主事务,添加部门信息,并调用带参数的自主事务,自己本身提交
CREATE OR REPLACE PROCEDURE PRO_DEPT_ADD2 AS
BEGININSERT INTO DEPT (DEPTNO, DNAME, LOC) VALUES (60, 'test1', 'test2');PRO_DEPT_ADD(70, 'test', 'test'); --如果调用的事务回滚,如果不是自主事务当前存储过程中插入数据也要一起回滚。但是添加了自主事务后,自主事务提交内容不会影响到当前存储过程COMMIT;
END;
调用主事务:
BEGINpro_dept_add2(); --调用完毕后,为60的部门插入成功,但是为70的部门信息回滚了。只有一条插入成功!
END;
总结自主事务:
1、自主事务处理结果的变化不依赖于主事务处理的状态或最终配置。
2、自主事务处理提交或回滚时,不影响主事务处理的结果。
3、自主事务提交一旦提交,该自主事务处理结果的变化对于其他事务处理就是课件的。这意味着,用于可以访问已更新的信息,无需等待主事务处理提交。
4、自主事务处理可以启动其它自主事务处理。
分类: Oracle
标签: oracle
好文要顶 关注我 收藏该文
Builder
关注 - 17
粉丝 - 51
+加关注
1
1
« 上一篇:Oracle基础 存储过程和游标
» 下一篇:Oracle基础 自定义函数
https://www.cnblogs.com/zhengcheng/p/4217531.html
存储过程中如何使用事务Transaction
学习也休闲 2014-08-16 13:21:54
一、Begin Trans、Rollback Trans、Commit Trans方法
1、用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
2、事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
二、存储过程中使用事务Transaction实例
Declare @id int
BEGIN TRANSACTION
Insert into xxxxxTable(f1,f2)values(@a,@b)
Select @id=@@identity
Insert into abcTable(ff1,ff2,ff3)values(@c,@id,@dd)
IF @@error <> 0 --发生错误
BEGIN
ROLLBACK TRANSACTION
RETURN 0
END
ELSE
BEGIN
COMMIT TRANSACTION
RETURN 1 --执行成功
END
参考资料: 存储过程中使用事务Transaction http://www.studyofnet.com/news/551.html
存储过程 事务 Transaction
https://www.douban.com/note/395757588/
Oracle 存储过程 中如何使用事务Transaction 自主事务 自治事务相关推荐
- oracle存储过程ddl,Oracle 存储过程中的DDL语句
Oracle的存储过程,是我们使用数据库应用开发的重要工具手段.在存储过程中,我们大部分应用场景都是使用DML语句进行数据增删改操作.本篇中,我们一起探讨一下数据定义语句DDL在存储过程中使用的细节和 ...
- java 创建临时表 oracle_在ORACLE存储过程中创建临时表
在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- oracle存储过程日志打印,如何在oracle存储过程中逐行打印
我正在执行一个存储过程,但它在某个时候失败了, 当前错误代码不帮我找到错误的位置和确切位置 我想知道它正在失败,所以想要在执行时逐行输出. 例如:如何在oracle存储过程中逐行打印 create o ...
- Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中:
摘要:最近项目中用到了Oracle存储过程,所以就自己尝试着写了下,下面我把我遇到的问题描述一下:就是在我处理解析Clob字段中的xml字符串的时候,有个需求就是根据指定的主键参数,来判断该参数的值是 ...
- oracle存储过程中数组的使用
oracle存储过程中数组的使用 create or replace package ArrayTestPKG1 is type tt_type is table of varchar(32) ...
- 资源放送丨《Oracle存储过程中的性能瓶颈点》PPT视频
前段时间,墨天轮分享了直播< SQL大赛冠军怀晓明:深入解析Oracle存储过程中的性能瓶颈点>,在这里我们共享一下PPT和视频,供大家参考学习. 在DBA日常工作中,经常会有这样的疑惑: ...
- oracle 存储过程中使用select 列 into 变量
在oracle存储过程中,有许多自己定义的变量,一般是需要赋值的,在这种情况下,一般来说,可以使用 select 列 into 变量 from table ,就是将列赋值给变量.
- Oracle 存储过程中,解决变量使用 in条件时,查询无效问题
oracle 存储过程中,定义变量之后,使用变量进行 in 条件查询时,会出现查询条件无效的问题 表结构 表数据 解决方法 create or replace type strsplit_type i ...
- oracle数据存储过程 中的循环 for 拼接字符串,oracle存储过程中使用字符串拼接
1.使用拼接符号"||" v_sql := 'SELECT * FROM UserInfo WHERE ISDELETED = 0 AND ACCOUNT =''' || vAcc ...
最新文章
- ue4android相机拍照插件,cordova-plugin-camera相機插件使用
- 杨建:网站加速--内容简介
- Redis Cluster高可用(HA)集群环境搭建详细步骤
- KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
- php远程文件包含攻击,PHP “is_a()”函数远程文件包含漏洞
- python手机端秒杀_python实现淘宝秒杀脚本
- android自动化持续集成,基于持续集成的Android自动化测试.pdf
- python 收发邮件_python发送各类邮件的主要基本方法
- 解决:Whitelabel Error Page This application has no explicit mapping for /error...UnknownHostException
- java C# objective-c AES对称加解密
- 面向对象分析与设计阅读笔记一
- 在windows生产环境搭建sphinx的注意事项
- Android使用keytool-importkeypair生成系统签名
- linux怎么取消光盘,怎样取消ubuntu官方光盘
- Unity用代码将多张图片合并为一张图片
- C语言飞机大战小游戏(2万字!完整精讲解版+源代码)
- 实现自定义大转盘抽奖
- HIT2020春软件构造lab1
- Linux系统下安装Adobe Flash Player插件观播放视频
- Redis的集群配置
热门文章
- android java 数组_关于android:Java按月将数组排列成多个数组
- 浅谈C++的泛型编程以及模板
- 用python画四瓣树叶_如何用Python画树?
- 信息安全-OAuth2.0:NuGetFromMicrosoft
- oracle新建数据库schema-建立数据库、表空间和用户
- lvm android分区合并,Linux LVM 分区扩容与多磁盘分区合并处理
- Emoji 表情符号 处理
- tomcat java 热部署,tomcat热部署
- Least Mean Squares Regression(二)
- 【干货】减少外贸邮件进垃圾箱,找EmailCamel解决!