- 积分
- 144
- 在线时间
- 74 小时
- 主题
- 4
- 注册时间
- 2013-6-7
- 帖子
- 69
- 最后登录
- 2024-8-20
- 帖子
- 69
- 软币
- 1709
- 在线时间
- 74 小时
- 注册时间
- 2013-6-7
|
本帖最后由 Arthur 于 2013-6-20 17:46 编辑
在存储过程中处理复杂逻辑以及事务控制不失是一个不错的办法。首先存储过程有较好的执行效率,其次负责也逻辑使用存储过程进行代码表述也更加简洁一些。在存储过程中事务的开始和提交(回滚)的操作应该是成对出现,便于代码调试。同时尽量减少嵌套事务的情况,嵌套事务会大大增加事务的控制难度和出错的几率。我将自己经常使用的存储过程事务控制以及错误返回方式献丑一下,抛砖引玉吧!:)
/* Author: Arthur
Create Date: 2013.6.19
Description: 事务控制、消息返回范例;
Parameter:
RETRUN_VALUE 返回操作结果,0 成功;-1 失败(非零值);
Msg 返回错误的具体描述信息;
*/
ALTER PROCEDURE p_Example
@ParameterA VARCHAR(20),
@ParameterB VARCHAR(20),
@ParameterC VARCHAR(20),
@Msg VARCHAR(MAX) OUTPUT
AS
BEGIN
--阻止在结果集中返回可显示受SQL 语句或存储过程影响的行计数的消息,提高效率;
SET NOCOUNT ON
DECLARE
@iTranCount INT --事务计数
BEGIN TRY --非事务性操作
--To do something ...
--如非事务性操作发生错误
--SET @Msg = '错误描述信息'
--RETRUN -1
--保存当前事务计数
SET @iTranCount = @@TRANCOUNT
--如当前未存在事务,则开始新事务;
--如事务已经存在,则事务控制权交给上层处理,上层可根据存储过程RETURN_VALUE 进行回滚或提交操作
IF @iTranCount = 0 BEGIN TRANSACTION
--事务性操作 --To do something ...
--如事务性操作发生错误, 引发错误 --RAISERROR ('错误描述信息', 16, 0)
IF @iTranCount = 0
BEGIN
IF XACT_STATE() = 0
COMMIT TRANSACTION
ELSE
RAISERROR ('Transaction commit fail.', 16, 0)
END
RETURN 1
END TRY
BEGIN CATCH
IF @iTranCount = 0 AND XACT_STATE() <> 0
ROLLBACK TRANSACTION
SET @Msg = ERROR_MESSAGE()
RETURN -1
END CATCH
END
|
评分
-
查看全部评分
|