2017-11-06 2 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 실행 중 하나로 설정되어

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

관련 문제