开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 4123|回复: 1

个人常用的存储过程事务控制心得以及范例!

[复制链接]

0

精华

239

贡献

144

赞扬

帖子
69
软币
1709
在线时间
74 小时
注册时间
2013-6-7
发表于 2013-6-19 23:01:03 | 显示全部楼层 |阅读模式
本帖最后由 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




评分

参与人数 3贡献 +3 赞扬 +2 收起 理由
rakehell + 1 Thanks
xiaomimi + 1 很给力
羽叶 + 3 感谢分享

查看全部评分

回复

使用道具 举报

0

精华

940

贡献

167

赞扬

正版授权组

Rank: 14Rank: 14Rank: 14Rank: 14

帖子
237
软币
2692
在线时间
264 小时
注册时间
2013-6-17
发表于 2013-6-20 04:34:15 | 显示全部楼层
好好学习学习,一直对数据库事务控制了解不深,谢了
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-12-22 21:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表