데이터베이스(예: SQL Server)에 트랜잭션을 커밋하지 않으면 어떻게 됩니까?
질문이 있다고 가정합니다.
begin tran
-- some other sql code
그리고 나서 저는 약속하거나 뒤로 굴러가는 것을 잊어버립니다.
다른 클라이언트가 쿼리를 실행하려고 하면 어떻게 됩니까?
트랜잭션을 커밋하거나 롤백하지 않는 한 트랜잭션은 여전히 "실행 중"이며 잠재적으로 잠금을 유지할 수 있습니다.
클라이언트(응용프로그램 또는 사용자)가 커밋하기 전에 데이터베이스에 대한 연결을 닫으면 여전히 실행 중인 트랜잭션이 롤백되고 종료됩니다.
여러분은 실제로 이것을 직접 시도할 수 있습니다. 이것은 여러분이 이것이 어떻게 작동하는지에 대한 느낌을 얻는 데 도움이 될 것입니다.
관리 스튜디오에서 두 개의 창(탭)을 열면 각각 SQL에 대한 자체 연결이 있습니다.
이제 한 창에서 트랜잭션을 시작하여 삽입/업데이트/삭제와 같은 작업을 수행할 수 있지만 아직 커밋하지는 않습니다.그러면 다른 창에서 트랜잭션 외부에서 데이터베이스가 어떻게 보이는지 볼 수 있습니다.분리 수준에 따라 첫 번째 창이 커밋될 때까지 테이블이 잠기거나 다른 트랜잭션이 지금까지 수행한 작업 등을 볼 수 있습니다.
다양한 격리 레벨을 사용하고 잠금 힌트를 사용하지 않고 결과에 어떤 영향을 미치는지 확인합니다.
또한 트랜잭션에서 오류를 발생시킬 때 발생하는 작업도 확인할 수 있습니다.
이 모든 것들이 어떻게 작동하는지 이해하는 것은 매우 중요합니다. 그렇지 않으면 종종 sql이 하는 일에 당황하게 될 것입니다.
재미있게 보내!지제이
트랜잭션은 완전히 실행되거나 전혀 실행되지 않습니다.트랜잭션을 완료하는 유일한 방법은 커밋하는 것입니다. 다른 방법을 사용하면 롤백이 발생합니다.
따라서 시작한 후 커밋하지 않으면 트랜잭션이 완료로 표시되지 않고 중단되었기 때문에 연결 종료 시 롤백됩니다.
수신 트랜잭션의 격리 수준에 따라 달라집니다.
트랜잭션을 열면 아무것도 자동으로 잠기지 않습니다.그러나 해당 트랜잭션 내에서 일부 쿼리를 실행하면 분리 수준에 따라 일부 행, 테이블 또는 페이지가 잠겨 다른 트랜잭션에서 액세스하려는 다른 쿼리에 영향을 줍니다.
트랜잭션 예제
말을 시작합니다.
SQL 문
오류가 발생한 경우 rollback transt 그렇지 않으면 커밋 transt.
커밋 전송을 실행하지 않은 한 데이터는 변경되지 않습니다.
커밋되지 않은 트랜잭션은 서버를 잠그고 다른 쿼리는 서버에서 실행되지 않습니다.트랜잭션을 롤백하거나 커밋해야 합니다.SSMS를 닫으면 다른 쿼리를 실행할 수 있는 트랜잭션도 종료됩니다.
잠재적인 잠금 문제 외에도 트랜잭션 로그가 활성 트랜잭션의 최소 LSN을 초과하여 잘릴 수 없기 때문에 크기가 커지기 시작하고 스냅샷 분리를 사용하는 경우 tempdb의 버전 저장소도 비슷한 이유로 크기가 커집니다.
사용할 수 있습니다.dbcc opentran
가장 오래된 열린 트랜잭션의 세부 정보를 확인합니다.
저는 거래하는 것을 정말 잊었습니다.아래 코드와 같은 질문이 있습니다.
이 저장 프로시저는 에 의해 호출됩니다.넷. 의 기능을 테스트해 보면.넷 애플리케이션, 예외는 에서 캡처됩니다.넷 애플리케이션.
아래와 같은 예외 메시지:
EXECUTE 후 트랜잭션 수는 BEGIN 문의 수와 COMMIT 문의 수가 일치하지 않음을 나타냅니다.이전 카운트 = 0, 현재 카운트 = 1.
실수를 깨달았을 때, 저는 둘 다 여러 번 시도했습니다.Net SQL Server Management Studio (2018.(SSMS에서 출력 문은 성공적으로 결과를 출력합니다.Results
는 탭, 그나에메가표시다니됩시지오러류에 됩니다.Messages
tab.).
그러면 이 트랜잭션에 사용된 테이블이 잠겨 있습니다. 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
'bestsource' 카테고리의 다른 글
셸 스크립트의 변수에 명령을 저장하려면 어떻게 해야 합니까? (0) | 2023.05.04 |
---|---|
Angular 2에서 추가 요소 없이 ngIf 사용 (0) | 2023.05.04 |
Mac App Store에서 Xcode를 설치할 수 없습니다. 디스크 공간이 부족합니다. (0) | 2023.05.04 |
Excel: 셀 색상을 기준으로 조건식을 만들 수 있습니까? (0) | 2023.05.04 |
Git가 지정된 파일을 무시하지 않는 이유는 무엇입니까? (0) | 2023.05.04 |