bestsource

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

bestsource 2023. 5. 4. 20:07
반응형

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

질문이 있다고 가정합니다.

begin tran
-- some other sql code

그리고 나서 저는 약속하거나 뒤로 굴러가는 것을 잊어버립니다.

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

트랜잭션을 커밋하거나 롤백하지 않는 한 트랜잭션은 여전히 "실행 중"이며 잠재적으로 잠금을 유지할 수 있습니다.

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

여러분은 실제로 이것을 직접 시도할 수 있습니다. 이것은 여러분이 이것이 어떻게 작동하는지에 대한 느낌을 얻는 데 도움이 될 것입니다.

관리 스튜디오에서 두 개의 창(탭)을 열면 각각 SQL에 대한 자체 연결이 있습니다.

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

다양한 격리 레벨을 사용하고 잠금 힌트를 사용하지 않고 결과에 어떤 영향을 미치는지 확인합니다.

또한 트랜잭션에서 오류를 발생시킬 때 발생하는 작업도 확인할 수 있습니다.

이 모든 것들이 어떻게 작동하는지 이해하는 것은 매우 중요합니다. 그렇지 않으면 종종 sql이 하는 일에 당황하게 될 것입니다.

재미있게 보내!지제이

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

따라서 시작한 후 커밋하지 않으면 트랜잭션이 완료로 표시되지 않고 중단되었기 때문에 연결 종료 시 롤백됩니다.

수신 트랜잭션의 격리 수준에 따라 달라집니다.

SQL 트랜잭션 분리 설명

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

트랜잭션 예제

말을 시작합니다.

SQL 문

오류가 발생한 경우 rollback transt 그렇지 않으면 커밋 transt.

커밋 전송을 실행하지 않은 한 데이터는 변경되지 않습니다.

커밋되지 않은 트랜잭션은 서버를 잠그고 다른 쿼리는 서버에서 실행되지 않습니다.트랜잭션을 롤백하거나 커밋해야 합니다.SSMS를 닫으면 다른 쿼리를 실행할 수 있는 트랜잭션도 종료됩니다.

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

사용할 수 있습니다.dbcc opentran가장 오래된 열린 트랜잭션의 세부 정보를 확인합니다.

저는 거래하는 것을 정말 잊었습니다.아래 코드와 같은 질문이 있습니다.

이 저장 프로시저는 에 의해 호출됩니다.넷. 의 기능을 테스트해 보면.넷 애플리케이션, 예외는 에서 캡처됩니다.넷 애플리케이션.

아래와 같은 예외 메시지:

EXECUTE 후 트랜잭션 수는 BEGIN 문의 수와 COMMIT 문의 수가 일치하지 않음을 나타냅니다.이전 카운트 = 0, 현재 카운트 = 1.

실수를 깨달았을 때, 저는 둘 다 여러 번 시도했습니다.Net SQL Server Management Studio (2018.(SSMS에서 출력 문은 성공적으로 결과를 출력합니다.Results는 탭, 그나에메가표시다니됩시지오러류에 됩니다.Messagestab.).

그러면 이 트랜잭션에 사용된 테이블이 잠겨 있습니다. 1000위 없이 top 할 때order desc결과를 선택할 수 있습니다. 내가 을만상위 1000선때택으로 때.order desc그것은 오랫동안 운영될 것입니다.

닫을 때.Net 응용 프로그램에서 변경되지 않은 데이터를 기준으로 트랜잭션이 커밋되지 않았습니다.

가 을때닫을 때.EXEC ...하는), 는 경고 ("SSMS"라는 메시지가 나타납니다.

커밋되지 않은 트랜잭션이 있습니다.이러한 트랜잭션을 커밋하시겠습니까?

저는 두 가지를 모두 테스트했습니다.Yes그리고.No선택 사항

가 면하릭을 하면.Yes트랜잭션이 커밋되었습니다.

가 면하릭을 하면.No거래가 커밋되지 않았습니다.

탭을 닫으면 잠긴 테이블이 해제되고 쿼리를 성공적으로 수행할 수 있습니다.

begin try 
    -- some process
    begin transaction
    update ...
    output ...
    

    insert ...

    -- I missing this commit statement below
    commit transaction  
end try
begin catch 
    if (xact_state()) = -1
    begin 
        rollback transaction;
        ;throw
    end;

    -- this statement I want to compare to 1, but mistake write to -1, but since the throw statement let the mistake can't be triggerd
    if (xact_state()) = 1
    begin
        commit transaction;
    end;
end catch;

동작이 정의되지 않았으므로 커밋 또는 롤백을 명시적으로 설정해야 합니다.

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

"자동 커밋 모드가 비활성화되어 있고 마지막 변경 사항을 명시적으로 커밋하거나 롤백하지 않고 연결을 닫으면 암묵적인 커밋 작업이 실행됩니다."

Hsqldb가 롤백을 수행합니다.

con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" +  insertedUserId + "','Anton','Alaf')");
con.close();

결과는

2011-11-14 14:20:22,519 주 INFO [SqlAutoCommitExample:55] [AutoCommitenabled=false] 2011-11-14 14:20:22,546 주 INFO [SqlAutoCommitExample:65] [데이터베이스에서 0# 사용자 발견]

언급URL : https://stackoverflow.com/questions/4896479/what-happens-if-you-dont-commit-a-transaction-to-a-database-say-sql-server

반응형