2017-11-06 16 views
-1

私はthis questionの私の執筆に関して数日前に尋ねています。BEGIN - COMMIT TRANSACTIONの予期しない、直感的でない動作

私のニーズに合う答えはということでした。私はそれがCOMMIT...に達すると、それは、すぐに有効になりますBEGIN....COMMIT TRANSACTIONUPDATE文を包む場合、私は思った、直感的に

UPDATE ProcActivity SET IsActive = 1 WHERE ProcedureName = 'proc_name' 
BEGIN TRANSACTION 
EXEC proc_name 
COMMIT TRANSACTION 
UPDATE ProcActivity SET IsActive = 0 WHERE ProcedureName = 'proc_name' 

が今ここに別のqustionです、 しかし、私は間違っていました。実際には、上記のようにすると、BEGIN...に達すると更新が行われます。

要約すると:

次のようにアップデートを行う:、IsActiveの値は(手続きが開始する前に更新が発効した)手順proc_nameの実行中に1に設定されている

UPDATE ProcActivity SET IsActive = 1 WHERE ProcedureName = 'proc_name' 
BEGIN TRANSACTION 
EXEC proc_name 
COMMIT TRANSACTION 
UPDATE ProcActivity SET IsActive = 0 WHERE ProcedureName = 'proc_name' 

cuasesを。このような

行う更新:

BEGIN TRANSACTION 
UPDATE ProcActivity SET IsActive = 1 WHERE ProcedureName = 'proc_name' 
COMMIT TRANSACTION 
EXEC proc_name 
UPDATE ProcActivity SET IsActive = 0 WHERE ProcedureName = 'proc_name' 

proc_nameの実行中には効果がありません。プロシージャの実行中にIsActiveの値は0に設定されます。

なぜこのように機能していますか?その背後にあるメカニズムは何ですか?

答えて

0

私はあなたの問題を再現することはできません - 1 - - 0両方のケースで、あなたは私が0を得る:

IF OBJECT_ID('[dbo].[StackOoverFlow]') IS NOT NULL 
BEGIN 
    DROP TABLE [dbo].[StackOoverFlow]; 
END; 

IF OBJECT_ID('[dbo].[usp_StackOoverFlow]') IS NOT NULL 
BEGIN 
    DROP PROCEDURE [dbo].[usp_StackOoverFlow]; 
END; 

GO 

CREATE TABLE [dbo].[StackOoverFlow] 
(
    [ProcedureName] SYSNAME 
    ,[IsActive] BIT 
); 

GO 

CREATE PROCEDURE [dbo].[usp_StackOoverFlow] AS 
BEGIN 
    SELECT [IsActive] 
    FROM [dbo].[StackOoverFlow] 
    WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 
END; 

GO 

INSERT INTO [dbo].[StackOoverFlow] ([ProcedureName], [IsActive]) 
VALUES ('[dbo].[usp_StackOoverFlow]', 0); 

GO 

SELECT [IsActive] 
FROM [dbo].[StackOoverFlow] 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 

BEGIN TRANSACTION 

UPDATE [dbo].[StackOoverFlow] 
SET [IsActive] = 1 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 

COMMIT TRANSACTION 

EXEC [dbo].[usp_StackOoverFlow]; 

UPDATE [dbo].[StackOoverFlow] 
SET [IsActive] = 0 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 

SELECT [IsActive] 
FROM [dbo].[StackOoverFlow] 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 


GO 

SELECT [IsActive] 
FROM [dbo].[StackOoverFlow] 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 

UPDATE [dbo].[StackOoverFlow] 
SET [IsActive] = 1 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 

BEGIN TRANSACTION 
EXEC [dbo].[usp_StackOoverFlow]; 
COMMIT TRANSACTION 

UPDATE [dbo].[StackOoverFlow] 
SET [IsActive] = 0 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 

SELECT [IsActive] 
FROM [dbo].[StackOoverFlow] 
WHERE [ProcedureName] = '[dbo].[usp_StackOoverFlow]'; 
+0

だから、両方のコードがまったく同じ効果がありますか?最初のコードは私が想定していた通りに動作しますか? –

+0

このコードは、SQL Serverで試すことができます。私の仕事環境では同じです。それがあなたのものと同じでない場合は、最初にSPのボディを表示することができます。 – gotqn

関連する問題