답변:
트랜잭션을 커밋 하거나 롤백 하지 않는 한 여전히 "실행 중"이며 잠재적으로 잠금을 유지합니다.
클라이언트 (응용 프로그램 또는 사용자)가 커밋하기 전에 데이터베이스에 대한 연결을 닫으면 여전히 실행중인 트랜잭션이 롤백되고 종료됩니다.
실제로 직접 시도해 볼 수 있으며 이것이 어떻게 작동하는지 느끼는 데 도움이 될 것입니다.
Management Studio에서 두 개의 창 (탭)을 열면 각각 SQL에 대한 자체 연결이 있습니다.
이제 하나의 창에서 트랜잭션을 시작하고 삽입 / 업데이트 / 삭제와 같은 작업을 수행 할 수 있지만 아직 커밋하지는 않습니다. 그런 다음 다른 창에서 데이터베이스가 트랜잭션 외부에서 어떻게 보이는지 볼 수 있습니다. 격리 수준에 따라 첫 번째 창이 커밋 될 때까지 테이블이 잠기거나 다른 트랜잭션이 지금까지 수행 한 작업을 볼 수 (없을) 수 있습니다.
결과에 어떤 영향을 미치는지 확인하기 위해 다양한 격리 수준을 사용하고 잠금 힌트를 사용하지 마십시오.
또한 트랜잭션에서 오류가 발생하면 어떻게되는지 확인하십시오.
이 모든 것들이 어떻게 작동하는지 이해하는 것이 매우 중요합니다. 그렇지 않으면 SQL이하는 일에 여러 번 당황 할 것입니다.
즐기세요! GJ.
트랜잭션은 완전히 실행되거나 전혀 실행되지 않습니다. 트랜잭션을 완료하는 유일한 방법은 커밋하는 것입니다. 다른 방법을 사용하면 롤백이 발생합니다.
따라서 시작하고 커밋하지 않으면 연결이 닫힐 때 롤백됩니다 (트랜잭션이 완료로 표시되지 않고 중단되었으므로).
들어오는 트랜잭션의 격리 수준에 따라 다릅니다.
트랜잭션을 열면 아무것도 잠기지 않습니다. 그러나 해당 트랜잭션 내에서 일부 쿼리를 실행하면 격리 수준에 따라 일부 행, 테이블 또는 페이지가 잠기므로 다른 트랜잭션에서 액세스를 시도하는 다른 쿼리에 영향을줍니다.
거래 예
tran tt 시작
SQL 문
오류가 발생한 경우 tran tt 롤백 그렇지 않으면 tran tt 커밋
commit tran tt를 실행하지 않는 한 데이터는 변경되지 않습니다.
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
예를 들어 작동하지 않습니다. 참조 stackoverflow.com/questions/1273376/...
동작이 정의되지 않았으므로 커밋 또는 롤백을 명시 적으로 설정해야합니다.
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"자동 커밋 모드가 비활성화되어 있고 명시 적으로 마지막 변경 사항을 커밋하거나 롤백하지 않고 연결을 닫으면 암시 적 COMMIT 작업이 실행됩니다."
Hsqldb가 롤백합니다.
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
결과는
2011-11-14 14 : 20 : 22,519 main INFO [SqlAutoCommitExample : 55] [AutoCommit enabled = false] 2011-11-14 14 : 20 : 22,546 main INFO [SqlAutoCommitExample : 65] [데이터베이스에서 0 # 사용자 발견]