네트워크 연결을 끊으면 쿼리가 중지됩니까?


13

최근에 100,000 레코드에 대한 업데이트 쿼리를 실행했습니다. 쿼리가 실행되는 동안 실수를하고 네트워크 케이블을 빨리 뽑았습니다.

업데이트 쿼리를 수행

  1. 처리를 중지하고 완전히 롤백 하시겠습니까?
  2. 처리를 계속 완료하고 커밋 하시겠습니까?
  3. 처리를 중지하고 대상 행의 일부만 업데이트 된 상태로 두시겠습니까?

2
쿼리가 서버에 도달하면 서버에서 쿼리를 취소하지 않는 한 계속됩니다.
JP Chauhan


1
Martin의 의견은 귀하의 질문 인 robocop에 대한 직접적인 답변을 제공합니다. 쿼리 실행이 완료 되기 전에 네트워크에서 연결 끊기 SQL Server에 알리면 SQL Server가이 를 롤백합니다. 그렇지 않으면 SQL Server에 네트워크 연결이 끊어 졌다고 알리기 전에 쿼리가 완료되면 커밋됩니다. 단일 업데이트 쿼리를 작성했다고 가정해도 SQL Server는 부분 업데이트를 실행하지 않습니다.
Nick Chammas

답변:


22

Nick과 Martin이 언급했듯이 쿼리의 최종 상태는 쿼리가 완료되기 전에 SQL Server가 네트워크 케이블 풀에 대해 알고 있는지 여부에 따라 다릅니다. 에서 온라인 (나는 그것이 이것에 대한 해당 주제에 있다는 것을 흥미 불구하고 2000 , 2005 , 20082008 R2 되지 2012 또는 2014 만) :

오류로 인해 트랜잭션이 성공적으로 완료되지 않으면 SQL Server는 자동으로 트랜잭션을 롤백하고 트랜잭션이 보유한 모든 리소스를 해제합니다. 데이터베이스 엔진 인스턴스에 대한 클라이언트의 네트워크 연결이 끊어지면 네트워크가 인스턴스에 중단을 알리면 연결에 대한 미해결 트랜잭션이 롤백됩니다. 클라이언트 응용 프로그램이 실패하거나 클라이언트 컴퓨터가 작동 중지되거나 다시 시작되면 연결도 끊어지고 네트워크에서 중단을 알릴 때 데이터베이스 엔진 인스턴스는 미해결 연결을 롤백합니다. 클라이언트가 응용 프로그램을 로그 오프하면 처리되지 않은 트랜잭션이 모두 롤백됩니다.

( 두 번째 문장의 단어 연결 은 아마도 거래일 것 입니다. 연결을 롤백하는 방법을 모르겠습니다.)

비슷한 방식으로, SQL Server는 서버가 예기치 않게 종료 된 후 복구 중에 트랜잭션을 실행 취소하거나 다시 실행할 수 있으며 이는 종료 시점의 트랜잭션 상태에 따라 다릅니다. 나는 사람들 이이 전술을 사용하여 당신이하려는 일을 수행하는 것을 보았습니다 (거래 취소). 그리고 서버가 다시 시작되었을 때 많은 작업이 단순히 다시 수행되었습니다 (무릎 부상 반응의 순 효과는 훨씬 더 가깝습니다) 예상보다 0으로).

따라서 네트워크 케이블을 잡아 당기거나 기계를 끄는 것과 같이 공황 상태에서 과감한 일을하는 대신 중요한 시스템에 대해 임시 쿼리를 실행하는 방법에 대해 더 나은 훈련을받을 것을 제안합니다. 예를 들어,

UPDATE dbo.sometable 
-- where *oops* I forgot this part

이것을 가지고 :

BEGIN TRANSACTION;

UPDATE dbo.sometable
-- where *oops* I forgot this part

-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;

그런 다음 업데이트가 실제로 올바른 경우 COMMIT부품을 강조 표시 하고 실행할 수 있습니다. 그렇지 않은 경우 침착하게 해당 ROLLBACK부분을 강조 표시 하고 실행할 수 있습니다. SSMS 도구 팩 과 같은 추가 기능을 사용 하여 New Query상용구를 포함하도록 템플릿을 편집 할 수도 있습니다 .

이제 트랜잭션이 다른 사용자를 차단하고 있기 때문에 쿼리를 실행 한 다음 커밋 또는 롤백 하지 않는 경우 여전히 문제가 발생할 수 있습니다 . 그러나 이것은 결정적으로 데이터를 수정하는 것보다 낫습니다.

물론 항상 그렇듯이 신뢰할 수있는 백업이 있어야합니다.


5
이것은 훌륭한 조언이며 OP 문제의 근본을 해결하지만 실제로 쿼리가 계속 실행되는지 여부에 대한 질문에는 대답하지 않습니다.
Nick Chammas

3
@Nick에게 감사드립니다. 제 동기는 증상이 아닌 원인을 설명하는 것이었지만 답변을 업데이트했습니다.
Aaron Bertrand

8

@ 아론이 맞습니다. 명령을 내리기 전에 거래를 만드는 것이 가장 좋습니다. 기억이 나지 않으면 Tools-Options설정 으로 이동 하여을 켜십시오 SET IMPLICIT_TRANSACTIONS. 특정 명령이 실행 되 자마자 자동으로 트랜잭션이 시작됩니다. 여기에는 UPDATE, DELETE이 것 모든 명령의 상당히 전체 목록 것으로 보인다 등 "change"뭔가. SELECT또한 목록에 포함되어 will거래를 시작합니다. 트랜잭션을 시작하는 명령의 전체 목록이 여기에서 설정 됩니다 . 이미 시작된 트랜잭션은 생성하지 않습니다. 이제 단점은 COMMIT변경 한 후에 기억해야한다는 것입니다 .

참고 : @Aaron의 제안에 따라 다시 강조하겠습니다.

This is very important!  You will have to remember to COMMIT after any change made!

기본적으로 당신을 잊고 떨어져 거래되고 BEGIN트랜잭션과에 잊고에 대해 뭔가를 엉망으로 COMMIT거래하고 당신이 그것을두고 연 다음 날 떠날 경우가 걸려 가지고. 트랜잭션을 롤백한다고 생각하는 쿼리 창을 닫는 것으로 테스트했지만 트랜잭션을 커밋하거나 롤백하려는 경우 프롬프트가 표시되었습니다.

여기에 이미지 설명을 입력하십시오


실제로 : 거래 SELECT 시작합니다 (이것은 귀하가 게시 한 링크에도 문서화되어 있음)
a_horse_with_no_name

그것을 잡아 주셔서 감사합니다 @a_horse_with_no_name! 나는 충분히주의 깊게 읽지 않았고 오래된 기억에서 벗어났습니다 (분명히 잘못되었습니다).
케네스 피셔

1
이것은 유용한 게시물이지만 쿼리가 계속 실행되는지 여부에 대한 OP의 질문에 실제로 대답하지는 않습니다.
Nick Chammas

2
@Aaron의 답변에 추가되었습니다. 의견을 제시하는 것은 많은 일이었습니다.
케네스 피셔

2

나는 그것이 정말로 달려 있다고 생각한다 :

네트워크 케이블을 분리하기 전에 명령이 이미 서버에 도달 한 경우 명령은 계속 정상적으로 실행됩니다.

모든 업데이트 명령을 캡슐화하는 TransactionScope (.Net에서 사용되며 다른 언어는 확실하지 않음)가있는 경우 transactionScope.Complete ()가 실행되지 않았지만 보장되지 않는 경우에만 트랜잭션이 커밋되지 않도록 중지 할 수 있습니다. .


2
"네트워크 케이블을 분리하기 전에 명령이 이미 서버에 도달하면 명령은 계속 정상적으로 실행됩니다." 이것은 Martin이 위에서 링크 한 SQL Server BOL 페이지와 모순 됩니다. "트랜잭션 처리 중 오류"를 참조하십시오 .
Nick Chammas

네 말이 맞아 트랜잭션이 지정되면 명령이 자동으로 롤백됩니다. 그러나 우리가 경험했듯이, 명시 적으로 트랜잭션이 지정되지 않은 경우 명령 (트랜잭션이없는 배치 업데이트)은 중간에 응용 프로그램을 중지 했음에도 불구하고 완전히 실행되었습니다. 실제로 연결이 끊어졌습니다. 그러나 타이밍과 같은 좋은 예는 아닙니다. 아마 틀렸을 것입니다. 아마도 그 테스트를하는 것이 좋을 것입니다
Rex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.