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

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

				
时间: 2024-10-17 23:54:55

SQL Server存储过程中使用事务的相关文章

SQL SERVER存储过程中使用事务与捕获异常

https://www.douban.com/note/559596669/ 格式类似于 CREATE PROCEDURE YourProcedure ASBEGIN    SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常       BEIN TRAN------------------开始事务        UPDATE A SET A.names = B.names FROM 表1 AS A INNER JOIN 表2 AS B ON

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正常的SQL语句,使用了Union(All)查询: SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --备注信息 , ai

【转】SQL SERVER 存储过程中变量的作用域

今天遇到一个很有趣的事情,以前没有注意过,所以记下来. 先来看例子. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE GetOrderBeforeDays @BeforDays INT AS BEGIN IF @BeforDays < 0 BEGIN DECLARE @Today DATETIME SET @Today = GETDATE() DECLARE @Date DATETIME SET @Date =

SQL Server 存储过程中处理多个查询条件的几种常见写法分析,我们该用那种写法

本文出处: http://www.cnblogs.com/wy123/p/5958047.html 最近发现还有不少做开发的小伙伴,在写存储过程的时候,在参考已有的不同的写法时,往往很迷茫,不知道各种写法孰优孰劣,该选用那种写法,以及各种写法优缺点,本文以一个简单的查询存储过程为例,简单说一下各种写法的区别,以及该用那种写法专业DBA以及熟悉数据库的同学请无视. 废话不多,上代码说明,先造一个测试表待用,简单说明一下这个表的情况 类似订单表,订单表有订单ID,客户ID,订单创建时间等,查询条件是

sql server存储过程中SELECT 与 SET 对变量赋值的区别

SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这两种方式还是有很多差别的. SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值. 当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法. 下表列出 SET 与 SELECT 的区别.请特别注意红色部分.   set select 同时对多个变量同时赋值 不支持 支

sql server存储过程中SELECT 与 SET 对变量赋值的区别 转自Theo

SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这两种方式还是有很多差别的. SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值. 当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法. 下表列出 SET 与 SELECT 的区别.请特别注意红色部分. set select 同时对多个变量同时赋值 不支持 支持

一、存储过程中使用事务的简单语法

一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Create Procedure MyProcedure( @Param1 nvarchar(10),@param2 nvarchar(10))ASBeginSet NOCOUNT ON;Set XACT_ABORT ON;Begin TranDelete from table1 where name=’

存储过程中的事务

一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 1 Create Procedure MyProcedure 2 3 ( @Param1 nvarchar(10), 4 5 @param2 nvarchar(10) 6 7 ) 8 9 AS 10 11 Begin 12 13 Set NOCOUNT ON; 14 15 Set XACT_ABORT ON; 16