SQLServer 存储过程嵌套事务处理

王朝学院·作者佚名  2016-05-26
窄屏简体版  字體: 小  |  中  |  大  |  超大  

SQLServer 存储过程嵌套事务处理 2014-04-09 17:01 by JentleWang, ... 阅读, ... 评论, 收藏, 编辑 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形。

下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否可能被其他存储过程调用的情况下,建议每个存储过程都按照这个模板建立

create PRoc proc_exampleas 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 -1end

解释:

1) 首先判断当前存储过程实例执行是否是嵌套事务调用。如果是嵌套,则存储过程判断的@@TRANCOUNT应该大于0,此时创建一个事务保存点,而非开启新事务;如果不是嵌套事务,则@@TRANCOUNT应该为0,此时开启新事务即可

2)然后,是存储过程本身的业务处理代码,每一步处理代码需要判断@@ERROR,如果<>0,执行error代码

3)最后,如果处理正确执行,并且非嵌套调用,则提交事务;如果发生错误,则回滚事务或者回滚保存点。

当然调用存储过程的地方,需要判断存储过程的返回值来做相应的处理

如有不对的地方,欢迎拍砖;如有其他方法,求分享,谢谢!O(∩_∩)O

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航