[sql-server] 트랜잭션을 데이터베이스 (예 : SQL Server)에 커밋하지 않으면 어떻게됩니까?

쿼리가 있다고 가정합니다.

begin tran
-- some other sql code

그런 다음 커밋하거나 롤백하는 것을 잊었습니다.

다른 클라이언트가 쿼리를 실행하려고하면 어떻게됩니까?



답변

트랜잭션을 커밋 하거나 롤백 하지 않는 한 여전히 “실행 중”이며 잠재적으로 잠금을 유지합니다.

클라이언트 (응용 프로그램 또는 사용자)가 커밋하기 전에 데이터베이스에 대한 연결을 닫으면 여전히 실행중인 트랜잭션이 롤백되고 종료됩니다.


답변

실제로 직접 시도해 볼 수 있으며 이것이 어떻게 작동하는지 느끼는 데 도움이 될 것입니다.

Management Studio에서 두 개의 창 (탭)을 열면 각각 SQL에 대한 자체 연결이 있습니다.

이제 하나의 창에서 트랜잭션을 시작하고 삽입 / 업데이트 / 삭제와 같은 작업을 수행 할 수 있지만 아직 커밋하지는 않습니다. 그런 다음 다른 창에서 데이터베이스가 트랜잭션 외부에서 어떻게 보이는지 볼 수 있습니다. 격리 수준에 따라 첫 번째 창이 커밋 될 때까지 테이블이 잠기거나 다른 트랜잭션이 지금까지 수행 한 작업을 볼 수 (없을) 수 있습니다.

결과에 어떤 영향을 미치는지 확인하기 위해 다양한 격리 수준을 사용하고 잠금 힌트를 사용하지 마십시오.

또한 트랜잭션에서 오류가 발생하면 어떻게되는지 확인하십시오.

이 모든 것들이 어떻게 작동하는지 이해하는 것이 매우 중요합니다. 그렇지 않으면 SQL이하는 일에 여러 번 당황 할 것입니다.

즐기세요! GJ.


답변

트랜잭션은 완전히 실행되거나 전혀 실행되지 않습니다. 트랜잭션을 완료하는 유일한 방법은 커밋하는 것입니다. 다른 방법을 사용하면 롤백이 발생합니다.

따라서 시작하고 커밋하지 않으면 연결이 닫힐 때 롤백됩니다 (트랜잭션이 완료로 표시되지 않고 중단되었으므로).


답변

들어오는 트랜잭션의 격리 수준에 따라 다릅니다.

SQL 트랜잭션 격리 설명


답변

트랜잭션을 열면 아무것도 잠기지 않습니다. 그러나 해당 트랜잭션 내에서 일부 쿼리를 실행하면 격리 수준에 따라 일부 행, 테이블 또는 페이지가 잠기므로 다른 트랜잭션에서 액세스를 시도하는 다른 쿼리에 영향을줍니다.


답변

거래 예

tran tt 시작

SQL 문

오류가 발생한 경우 tran tt 롤백 그렇지 않으면 tran tt 커밋

commit tran tt를 실행하지 않는 한 데이터는 변경되지 않습니다.


답변

잠재적 인 잠금 문제 외에도 활성 트랜잭션에 대한 최소 LSN을 초과하여자를 수 없기 때문에 트랜잭션 로그가 증가하기 시작하고 스냅 샷 격리를 사용하는 경우 tempdb의 버전 저장소가 증가합니다. 비슷한 이유.

를 사용 dbcc opentran하여 가장 오래된 미결 거래의 세부 정보를 볼 수 있습니다 .