• SQL Server存储过程中使用事务


    今天修改之前一个同事写的代码,发现方法中直接执行了两个sql语句,一个是删除用户,一个是删除该用户的权限。由于数据库数据比较多,导致有时候这个两个sql不能都执行成功,数据库出现了脏数据。

    鉴于这个原因,我把两个sql放到了一个存储过程中执行,在存储过程中添加事务,使其要么都执行,要么都不执行。

    代码框架如下:

     1 CREATE PROCEDURE pro_TrancDemo @backvalue INT OUTPUT
     2 AS
     3     BEGIN
     4         SET NOCOUNT ON;
     5         
     6         BEGIN TRY
     7             SET @backvalue = 1; --如果事务没有回滚就返回该值,代表事务执行成功。注意:这句也可以放到BEGIN TRAN t之后第一行,因为事务中出现回滚不会回滚对变量的赋值操作
     8             BEGIN TRAN t --开始事务
     9             --delete语句1
    10             --delete语句2
    11             --other SQL sentences …………
    12             COMMIT TRAN t
    13         END TRY
    14         BEGIN CATCH
    15             IF XACT_STATE() <> 0
    16                 BEGIN 
    17                     SET @backvalue = 0; --如果事务回滚就返回0,代表事务执行失败.
    18                     ROLLBACK TRAN t;
    19                 END
    20         END CATCH
    21     END 
    22 GO

    注释:

    XACT_STATE()函数在SQL Server 2005及其之后的版本中可用,该函数返回下列值:

     0 : 当前请求没有活动的用户事务

     1 : 当前请求有活动的用户事务。请求可以执行任何操作,包括写入数据和提交事务

    -1 : 当前请求具有活动的用户事务,但法提交事务或回滚到保存点;它只能请求完全回滚事务

     同事给我了另外一种解决方法,可以参考一下:

    
    
  • 相关阅读:
    上周热点回顾(12.1212.18)
    上周热点回顾(11.2111.27)
    上周热点回顾(11.1411.20)
    博客园电子期刊2011年11月刊发布啦
    “CDN加速”测试
    上周热点回顾(11.2812.4)
    上周热点回顾(12.1912.25)
    上周热点回顾(12.512.11)
    提醒:安装MS11100 .NET Framework高危漏洞补丁一定要所有服务器一起安装
    郑州公积金
  • 原文地址:https://www.cnblogs.com/stevenjson/p/4261193.html
Copyright © 2020-2023  润新知