문제

회사에서 사용하는 사내 애플리케이션 프레임 워크는 명령이 데이터베이스를 변경하지 않는다는 것을 알고 있더라도 모든 SQL 쿼리를 트랜잭션에 넣어야합니다. 세션이 끝나면 연결을 닫기 전에 거래를 제대로 닫기 위해 거래를합니다. 특히 속도 측면에서 다시 롤링하면 특별한 차이가 있는지 궁금합니다.

Oracle을 사용하고 있지만 다른 데이터베이스는 비슷한 동작을 가지고 있다고 생각합니다. 또한 트랜잭션을 시작 해야하는 요구 사항에 대해 아무것도 할 수 없습니다. 코드베이스의 일부는 내 손에서 벗어났습니다.

도움이 되었습니까?

해결책

데이터베이스는 종종 사전 이미지 저널 (거래 전) 또는 이미지 후 이미지 저널 (거래가 완료 될 때 어떻게 될 것인가)를 보존합니다. 이전 이미지를 유지하면 롤백에서 복원해야합니다. . 이후 이미지를 유지하는 경우 커밋시 데이터를 교체해야합니다.

오라클에는 저널과 롤백 공간이 모두 있습니다. Transaction Journal은 나중에 DB Writers가 작성한 블록을 축적합니다. 이것들은 비소이기 때문에 DB Writer 관련은 거의 거래에 영향을 미치지 않습니다 (대기열이 채워지면 기다려야 할 수도 있습니다.)

쿼리 전용 트랜잭션조차도 Oracle의 롤백 영역에 약간의 트랜잭션 기록 보관이 있다고 생각합니다. 나는 롤백이 실제로 롤백 할 것이 없다고 판단하기 전에 Oracle의 작품에 약간의 작업이 필요하다고 생각합니다. 그리고 나는 이것이 당신의 거래와 동 기적이라고 생각합니다. 롤백이 완료 될 때까지 잠금 장치를 실제로 해제 할 수 없습니다. [예, 거래에 사용하지 않는다는 것을 알고 있지만 잠금 문제는 롤백을 완전히 릴리스해야한다고 생각하는 이유입니다. 그러면 모든 잠금 장치가 릴리스되고 롤백이 완료됩니다.

다른 한편으로, 커밋은 예상 결과가 더 많거나 무의미하며, 롤백 영역을 폐기하는 것이 약간 더 빠를 수 있다고 생각합니다. 당신은 거래 항목을 만들지 않았으므로 DB 작가는 할 일이 없다는 것을 확인하고 깨어나지 않을 것입니다.

또한 커밋이 더 빠르지 만 차이는 사소 할 것으로 기대합니다. 따라서 사소하여 나란히 비교할 때도 측정 할 수 없을 수도 있습니다.

다른 팁

이 경우 커밋과 롤백 사이에는 차이가 없다는 이전 답변에 동의합니다. CPU 시간에는 롤백 할 것이 없다고 판단하는 데 필요한 CPU 시간이 없다고 판단하는 데 필요한 CPU 시간에 무시할만한 차이가있을 수 있습니다. 그러나 무시할만한 차이라면 안전하게 잊을 수 있습니다.

그러나 단일 트랜잭션의 맥락에서 많은 쿼리를 수행하는 세션과 일련의 트랜잭션의 맥락에서 동일한 쿼리를 수행하는 세션간에 차이가 있다는 점을 지적 할 가치가 있습니다.

클라이언트가 트랜잭션을 시작하고 쿼리를 수행하고 통신기 롤백을 수행 한 다음 두 번째 트랜잭션을 시작하고 두 번째 쿼리를 수행하면 두 번째 쿼리가 첫 번째 쿼리와 동일한 데이터베이스 상태를 관찰 할 것이라는 보장은 없습니다. 때로는 데이터에 대한 일관된 견해를 유지하는 것이 본질입니다. 때로는 데이터에 대한보다 현재의 관점을 얻는 것이 본질입니다. 그것은 당신이하는 일에 달려 있습니다.

나는 OP 가이 질문을하지 않았다는 것을 안다. 그러나 일부 독자들은 마음 뒤에 그것을 묻고있을 것입니다.

일반적으로 커밋은 롤백보다 훨씬 빠르지 만 아무것도하지 않은 경우 효과적으로 동일합니다.

문서는 다음을 명시합니다.

  • Oracle은 Oracle 데이터베이스를 분리하기 전에 마지막 트랜잭션을 포함한 커밋 또는 롤백 명세서로 응용 프로그램 프로그램의 모든 트랜잭션을 명시 적으로 종료하는 것이 좋습니다. 거래를 명시 적으로 커밋하지 않고 프로그램이 비정상적으로 종료되면 마지막으로 커밋되지 않은 트랜잭션이 자동으로 롤백됩니다. 대부분의 Oracle 유틸리티 및 도구에서 정상적인 출구로 인해 현재 트랜잭션이 커지게됩니다. Oracle Precompiler 프로그램의 일반 출구는 거래를 커밋하지 않으며 Oracle 데이터베이스에 의존하여 현재 트랜잭션을 롤백합니다.

http://download.oracle.com/docs/cd/b28359_01/server.111/b28286/statements_4010.htm#sqlrf01110

당신이 O가 하나 또는 다른 것을하기를 선택한다면, 당신은 아무것도하지 않는 것과 같은 것을 할 수도 있고, 그냥 저지르십시오.

글쎄, 우리는 Select가 Oracle에서 무엇을 반환하는지 고려해야합니다. 두 가지 모드가 있습니다. 기본적으로 SELECT는 SELECT 문이 실행되기 시작한 순간에 해당 데이터가 보았을 때 데이터를 반환합니다 (이것은 기본 트랜잭션 모드 인 Read Commited Displation Mode의 기본 동작입니다). 따라서 결과 세트에서 표시되지 않는 SELECT가 발행 된 후 업데이트/삽입물이 실행 된 경우.

두 가지 결과 세트 (예 : 일반 원장 앱의 Debta 및 신용 측면)를 비교 해야하는 경우 문제가 될 수 있습니다. 이를 위해 두 번째 모드가 있습니다. 해당 모드에서 현재 트랜잭션이 시작된 순간 (읽기 전용 및 직렬화 가능한 격리 수준의 기본 동작)가 보았을 때 데이터를 반환합니다.

따라서 적어도 때때로 트랜잭션에서 선택을 실행해야합니다.

DML을하지 않았기 때문에 Oracle의 커밋과 롤백 사이에는 차이가 없을 것 같습니다. 어느 쪽이든 할 일이 없습니다.

나는 커밋이 더 효율적일 것이라고 생각합니다. 일반적으로 대부분의 DB 트랜잭션이 커밋 될 것으로 예상됩니다. 따라서 DB 가이 경우에 최적화한다고 생각할 것입니다 (롤백에 더 효율적으로 노력하는 것과는 달리).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top