SQLServer 存储过程嵌套事务处理
某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形。
下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否可能被其他存储过程调用的情况下,建议每个存储过程都按照这个模板建立
create proc proc_example
as
begin
--声明变量,存放当前已开启的事务数
declare @exist_trancount int
select @exist_trancount = @@trancount if @exist_trancount > 0
--创建事务保存点
save transaction tran_proc
else
--开启新事务
begin transaction tran_proc /*
存储过程业务处理代码
·········
*/
if @@error<>0
goto error if @exist_trancount = 0
--提交事务
commit tran tran_proc
return 1
error:
--回滚事务或者事务保存点
rollback transaction tran_proc
return -1 end
解释:
1) 首先判断当前存储过程实例执行是否是嵌套事务调用。如果是嵌套,则存储过程判断的@@TRANCOUNT应该大于0,此时创建一个事务保存点,而非开启新事务;如果不是嵌套事务,则@@TRANCOUNT应该为0,此时开启新事务即可
2)然后,是存储过程本身的业务处理代码,每一步处理代码需要判断@@ERROR,如果<>0,执行error代码
3)最后,如果处理正确执行,并且非嵌套调用,则提交事务;如果发生错误,则回滚事务或者回滚保存点。
当然调用存储过程的地方,需要判断存储过程的返回值来做相应的处理
如有不对的地方,欢迎拍砖;如有其他方法,求分享,谢谢!O(∩_∩)O
SQLServer 存储过程嵌套事务处理的更多相关文章
- SQLSERVER存储过程基础
SQLSERVER存储过程基础 1.声明变量 DECLARE @F001 SMALLINT, (三元素,声明declare+变量名+类型) @F002 INTEGER, @F003 V ...
- 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)
解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...
- Sqlserver 存储过程中结合事务的代码
Sqlserver 存储过程中结合事务的代码 --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ ...
- SqlServer存储过程学习笔记(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
- 创建并在项目中调用SQLSERVER存储过程的简单示例
使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC ...
- SQLSERVER存储过程语法详解
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...
- SqlServer存储过程详解
SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...
- sqlServer存储过程与sql语句的区别
sqlServer 存储过程与sql语句的区别 sql存储过程与sql语句的区别: 从以下几个方面考虑: 1.编写: 存储过程:编写比较难: sql语句:相对简单: 2.性能: 存储过程:高,可移 ...
- SqlServer存储过程(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
随机推荐
- Windows Phone开发(1):概论
原文:Windows Phone开发(1):概论 Windows Phone是微软公司开发的手机操作系统,这里就不多介绍,和Android,iPhone一样运行在智能手机上,相信大家都很熟悉. 目前来 ...
- Windows Phone开发(4):框架和页
原文:Windows Phone开发(4):框架和页 在开如之前,我想更正一个小问题,之前我在第一篇文章中说,Visual Studio Express for Windows Phone的中文版没有 ...
- Drupal 7 模 .info 文件描述
Drupal使用.info文件以节省话题(theme)和模块(modules)基本数据(metadata). 编码:推荐使用UTF-8.这是一个没有BOM(Byte Order Mark). 下面是一 ...
- CentOS 6 安装Oracle11g
原创作品.从 "深蓝blog" 博客,欢迎转载,请务必注明转载如下源.否则追究其版权责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/ar ...
- PocketSphinx语音识别系统语言模型的训练和声学模型的改进
PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...
- java序列化是什么和反序列化和hadoop序列化
1.什么是序列化和系列化DE- 神马是序列化它,序列化是内存中的对象状态信息,兑换字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什 ...
- Ubuntu 13.04/12.10安装Oracle 11gR2图文教程(转)
Ubuntu 13.04/12.10安装Oracle 11gR2图文教程 原文标题:How to Install Oracle 11G R2 Enterprise Edition Database U ...
- debain install scim
1. su input root pwd 2. apt-cache search scim apt-get install scim apt-cache search scim-pinyin apt- ...
- Android源码文件夹结构
Android 2.2 |-- Makefile |-- bionic (bionic C库) |-- bootable (启动引导相关代码) |-- ...
- 联想A798T刷机包 基于百度云V6 集成RE3.1.7美化版 精简冗余文件
ROM介绍 1.apk进行odex合并及zipaliang优化-省电及降低内存暂用. 2.測试相机.通话.数据.wifi.蓝牙.等传感器均正常,. 3.提供时间居中防iphone状态栏补丁 4.增加I ...