선택 항목만 있는 트랜잭션에서 커밋과 롤백 사이에 차이점이 있습니까?
회사에서 사용하는 사내 애플리케이션 프레임워크를 사용하면 모든 SQL 쿼리를 트랜잭션에 넣어야 합니다. 데이터베이스에서 변경되는 명령이 없음을 알고 있더라도 말입니다.세션이 끝나면 연결을 닫기 전에 올바르게 닫기 위해 트랜잭션을 커밋합니다.뒤로 돌렸는지, 특히 속도 면에서 특별한 차이가 있었는지 궁금합니다.
Oracle을 사용하고 있지만 다른 데이터베이스도 비슷한 동작을 하는 것으로 알고 있습니다.또한 거래를 시작하기 위한 요구 사항에 대해서는 아무것도 할 수 없습니다. 코드베이스의 그 부분은 제 손에서 벗어나 있습니다.
데이터베이스는 종종 사전 이미지 저널(거래 전의 내용) 또는 사후 이미지 저널(거래가 완료될 때의 내용)을 보존합니다.이전 이미지를 유지하는 경우 롤백 시 복원해야 합니다.잔상을 유지하는 경우 커밋 시 데이터를 대체해야 합니다.
Oracle에는 저널 공간과 롤백 공간이 모두 있습니다.트랜잭션 저널에는 나중에 DB 작성자가 작성하는 블록이 누적됩니다.이들은 비동기식이므로 DB 작성기와 관련된 거의 모든 것이 트랜잭션에 영향을 미치지 않습니다(대기열이 가득 찬 경우에는 기다려야 할 수도 있습니다).
쿼리 전용 트랜잭션의 경우에도 Oracle의 롤백 영역에 약간의 트랜잭션 레코드를 유지할 수 있습니다.롤백을 수행하려면 Oracle 측에서 실제로 롤백할 작업이 필요하지 않다고 판단해야 합니다.그리고 저는 이것이 당신의 거래와 일치한다고 생각합니다.롤백이 완료될 때까지 잠금을 해제할 수 없습니다.[네, 트랜잭션에 사용하지 않는 것은 알지만, 잠금 문제는 롤백을 완전히 해제한 다음 모든 잠금을 해제할 수 있고, 그러면 롤백이 완료된다는 것입니다.]
반면에 커밋은 다소 예상된 결과이며 롤백 영역을 폐기하는 것이 조금 더 빠를 수 있다고 생각합니다.트랜잭션 항목을 만들지 않았기 때문에 DB 작성자는 작업할 내용이 없음을 확인하고 확인할 수도 없습니다.
또한 커밋이 더 빠를 수 있지만 차이는 미미할 것으로 예상합니다.너무 작아서 나란히 비교해도 측정할 수 없을 정도입니다.
이 경우 COMMIT와 ROLBOLLBACK 사이에 차이가 없다는 이전 답변에 동의합니다.커밋할 내용이 없음을 확인하는 데 필요한 CPU 시간과 롤백할 내용이 없음을 확인하는 데 필요한 CPU 시간이 크게 다를 수 있습니다.하지만, 사소한 차이라면, 우리는 그것에 대해 안전하게 잊을 수 있습니다.
그러나 단일 트랜잭션의 맥락에서 여러 쿼리를 수행하는 세션과 일련의 트랜잭션의 맥락에서 동일한 쿼리를 수행하는 세션 사이에는 차이가 있다는 점을 지적할 필요가 있습니다.
클라이언트가 트랜잭션을 시작하고 쿼리를 수행하고 COMMIT 또는 ROLBACK을 수행한 다음 두 번째 트랜잭션을 시작하고 두 번째 쿼리를 수행하면 두 번째 쿼리가 첫 번째 쿼리와 동일한 데이터베이스 상태를 관찰한다는 보장이 없습니다.데이터의 일관된 단일 보기를 유지하는 것이 중요한 경우도 있습니다.때로는 데이터를 보다 최신 상태로 보는 것이 중요합니다.그것은 당신이 무엇을 하느냐에 달려 있습니다.
알아요, 알아요, OP가 이런 질문을 한 게 아닙니다.하지만 어떤 독자들은 마음 속 깊은 곳에서 그것을 묻고 있을지도 모릅니다.
일반적으로 커밋은 롤백보다 훨씬 빠르지만, 아무것도 하지 않은 경우에는 효과적으로 동일합니다.
설명서에는 다음이 명시되어 있습니다.
- Oracle은 Oracle Database와의 연결을 끊기 전에 마지막 트랜잭션을 포함하여 애플리케이션 프로그램의 모든 트랜잭션을 COMMIT 또는 ROLBACK 문으로 명시적으로 종료하는 것이 좋습니다.명시적으로 트랜잭션을 커밋하지 않고 프로그램이 비정상적으로 종료되면 커밋되지 않은 마지막 트랜잭션이 자동으로 롤백됩니다.대부분의 Oracle 유틸리티 및 도구가 정상적으로 종료되면 현재 트랜잭션이 커밋됩니다.Oracle 사전 컴파일러 프로그램에서 정상적으로 종료하더라도 트랜잭션은 커밋되지 않으며 Oracle Database를 사용하여 현재 트랜잭션을 롤백합니다.
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4010.htm#SQLRF01110
둘 중 하나를 선택하고 싶다면 아무것도 하지 않는 것과 같은 것을 하고 그냥 그것을 저지르는 것이 좋습니다.
Oracle에서 SELECT가 반환하는 내용을 고려해야 합니다.두 가지 모드가 있습니다.기본적으로 SELECT는 SELECT 문이 실행을 시작한 바로 그 순간에 검색된 데이터를 반환합니다(이것은 READ COMMITED 분리 모드, 기본 트랜잭션 모드의 기본 동작입니다).따라서 SELECT가 실행된 후 UPDATE/INSERT가 실행되면 결과 집합에 표시되지 않습니다.
두 결과 집합(예: 일반 원장 앱의 부채 및 대변)을 비교해야 하는 경우 이 문제가 발생할 수 있습니다.이를 위해 두 번째 모드가 있습니다.이 모드에서 SELECT는 현재 트랜잭션이 시작된 순간(읽기 전용 및 직렬화 가능 분리 레벨의 기본 동작)을 확인한 대로 데이터를 반환합니다.
따라서 적어도 때때로 트랜잭션에서 SELECT를 실행해야 합니다.
당신이 DML을 전혀 하지 않았기 때문에, 나는 오라클에서 커밋과 롤백 사이에 차이가 없을 것이라고 생각합니다.어느 쪽이든 할 일이 없습니다.
일반적으로 대부분의 DB 트랜잭션이 커밋될 것으로 예상되므로, 이 경우 DB가 롤백에 더 효율적으로 적용되는 것이 아니라 최적화된다고 생각할 수 있습니다.
언급URL : https://stackoverflow.com/questions/198108/is-there-a-difference-between-commit-and-rollback-in-a-transaction-only-having-s
'programing' 카테고리의 다른 글
VBA 프로젝트의 조건부 컴파일 속성을 프로그래밍 방식으로 변경하는 방법 (0) | 2023.06.11 |
---|---|
UI 테이블 보기에서 구분선을 제거하는 방법이 있습니까? (0) | 2023.06.11 |
API를 통해 Wordpress 플러그인에서 symphony 백엔드 서버로 파일을 업로드할 수 없습니까? (0) | 2023.06.11 |
포크 이후 하위 프로세스 디버깅(팔로우포크 모드 하위 구성) (0) | 2023.06.11 |
data.frame에서 단일 열의 이름을 변경하는 방법은 무엇입니까? (0) | 2023.06.11 |