这个问题与此问题有关: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中做到这一点!
我非常感谢一些帮助:)
答案 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
当我取消注释我的开始和回滚时,我的值会增加,而当我不再保持不变时。