2017-12-29 22 views
1

나는이 저장 프로 시저를 가지고 (더가 트란을 시작하지 않고 커밋됩니다)SQL - 연결 문제가 발생했을 때 저장 프로 시저의 일부만 실행될 수 있습니까? 예를 들어

DECLARE @ID1 int 
DECLARE @ID2 int 

--Let's say this insert takes 1 second. 
INSERT INTO table1 (field1,field2) 
VALUES('test', 1) 

--And this insert takes another second. 
INSERT INTO table2 (field1,field2) 
VALUES ('testing', 2) 
SQL 서버가 정전으로 인해 1.5 초 (리얼 스토리) 후 아래로 갈 것입니다 경우에 일어 났을 것 무엇

. 당신이 transaction에 저장 프로 시저를 실행하면

+0

는이 절차의 끝에서 COMMIT 있습니까? – twyly

+0

둘 다 실행 가능성이 있습니다. 서버에서 연결을 끊어도 SQL Server가 다운되어 액세스 할 수 없다는 의미는 아닙니다. DBCC Opentran에서 테스트 –

+0

으로 확인하십시오. @twyly 커밋 및 롤백 없음. –

답변

2

:

begin tran 
    exec sp 
commit 

와 클라이언트의 연결이 끊어 그것을 실행하는 동안은, 당신의 SP에 의해 수행 된 모든 작업은 롤백됩니다.

당신이 당신의 거래에서하지 시저 및 롤백됩니다 분리 동안 실행 된 하나 insert 다른 사이의 클라이언트 연결을 끊습니다, 완료했다 insert이 영향을받지 않을 것이라고 insert 호출하는 경우.

생식 :

create table dbo.table1 (id int); 
go 

create proc dbo.sp_test 
as 
--Let's say this insert takes 1 second. 
INSERT INTO dbo.table1 
VALUES(1) 
waitfor delay '00:05:00' 
--And this insert takes another second. 
INSERT INTO dbo.table1 
VALUES (2) 
go 


--open new query window and write there: 
begin tran 
    exec dbo.sp_test; 
commit; 

-- wait for some seconds; close this window 
-- now check for what was inserted: 

select * 
from dbo.table1; 
--- 
-- nothing was inserted 


--open new query window and write there: 

    exec dbo.sp_test; 

-- wait for some seconds; close this window 
-- now check for what was inserted: 

select * 
from dbo.table1; 
--- 
--1 
+0

그것이 제가 생각한 것입니다.이 시나리오를 재현 할 수있는 방법이 있습니까? –

+2

물론 있습니다. 삽입 사이에 waitfor delay '00 : 05 : 00 '을 추가하면 첫 번째 삽입 후 5 분 동안 코드가 대기하고 몇 초 후에 SP를 실행하는 SSMS 쿼리 창을 닫고 트랜잭션/명시 적 트랜잭션이 없으면 어떤 테이블을 삽입했는지 확인하십시오. – sepupic

+0

Thx, db 레벨에서 모든 저장 프로 시저가 Begin Tran Rollback처럼 작동하도록 정의 할 수 있습니까? 아니면 수동으로 수행해야합니까? –