回滚过程调用

时间:2018-02-14 10:27:04

标签: .net sql-server

这个问题与此问题有关:Executing a stored procedure inside BEGIN/END TRANSACTION

该问题的一个答案表明事务中的所有内容都可以回滚,因此我想知道为什么在回滚事务时,由简单存储过程调用更新的值仍然会更新。

这是一个简单的例子:

BEGIN TRANSACTION
    DECLARE @id varchar(30) = 'BCPEDEV/'
    DECLARE @lvalue float
    EXEC sp_update_num @id, @outValue OUTPUT
    PRINT 'outValue = ' + CONVERT(varchar, @outValue) -- Prints updated value       
ROLLBACK -- Value stays updated after rollback

然后我检查值whith:

SELECT NUM FROM MyTable WHERE Id = @id

以下是程序本身:

ALTER PROCEDURE [dbo].[sp_update_num] @id varchar (21) AS
    BEGIN   
        DECLARE @UpdatedValues table (NUM float NULL);
        DECLARE @CLE_ID varchar(15) 
                UPDATE TOP(1) [dbo].[MyTable]
                    SET NUM = NUM + 1
                    OUTPUT inserted.NUM INTO @UpdatedValues 
                    WHERE ID = @id AND ETAT = 0     
            SELECT NUM FROM @UpdatedValues  
    END

该过程通过递增来更新表中的单个值,并且过程中没有事务。

我试图在ADO.Net中这样做但后来我意识到我无法在纯SQL中做到这一点!

我非常感谢一些帮助:)

1 个答案:

答案 0 :(得分:0)

基于此我们不知道你的SP是怎样的,我试图写一个我的自己,这是滚动的反射:

表格和测试数据

CREATE TABLE [dbo].[Dest1](
    [FirstName] [nvarchar](50) NULL,
    [LastName] [nvarchar](50) NULL,
    [values] [float] NULL
) ON [PRIMARY]

GO


insert into dbo.Dest1(FirstName,LastName,[values])
values
('Thomas','Jensen',1),
('Hans','Larsen',1)

<强> SP

ALTER PROCEDURE [dbo].[SP_NAME_update]
    -- Add the parameters for the stored procedure here

   @id varchar(30),

    @outValue float OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;



   update [LegOgSpass].[dbo].[Dest1] set [values] = [values]+1 where FirstName=@id

   select @outValue = @@ROWCOUNT

END

SQL代码

BEGIN TRANSACTION
    DECLARE @id varchar(30) = 'thomas'
 DECLARE @outValue float

    EXEC [dbo].[SP_NAME_update] @id,@outValue OUTPUT
    PRINT 'outValue = ' + CONVERT(varchar, @outValue) -- Prints updated value       
ROLLBACK -- Value stays updated after rollback

当我取消注释我的开始和回滚时,我的值会增加,而当我不再保持不变时。