문제

데이터베이스에서 읽기 위해 트랜잭션을 사용하는 것에 대한 의견이 매우 다른 것 같습니다.

DeveloperWorks 기사에서 인용합니다 거래 전략 : 모델 및 전략 개요:

데이터 만 읽고 있다면 거래가 필요한 이유는 무엇입니까? 대답은 당신이하지 않는다는 것입니다. 읽기 전용 작업을 수행하기 위해 트랜잭션을 시작하면 처리 스레드의 오버 헤드가 추가되며 데이터베이스에서 공유 된 읽기 잠금을 유발할 수 있습니다 (사용중인 데이터베이스 유형 및 격리 수준이 설정된 내용에 따라).

반대 의견으로 Hibernate Documentation의 다음 인용문이 있습니다. 비 트랜잭션 데이터 액세스 및 자동 커밋 모드

우리의 권장 사항은 응용 프로그램에서 자동 커밋 모드를 사용하지 않고 명백한 성능 이점이 있거나 향후 코드 변경이 거의 없을 때만 읽기 전용 트랜잭션을 적용하는 것입니다. 데이터를 읽거나 쓰는지 여부에 관계없이 항상 데이터 액세스 작업을 그룹화하기 위해 정기적 인 산 거래를 선호합니다.

Eclipselink 메일 링리스트에 비슷한 토론도 있습니다. 여기.

그렇다면 진실은 어디에 있습니까? 최고의 실습을 읽는 거래입니까? 두 가지 모두 실행 가능한 솔루션이라면 거래 사용 기준은 무엇입니까?

내가 볼 수있는 한, 격리 수준이 '저 커밋 된'것보다 높은 경우에만 차이를 만듭니다. 이 올바른지?

경험과 권장 사항은 무엇입니까?

도움이 되었습니까?

해결책

Steven Devijver는 운영이 데이터베이스를 읽는 경우에도 거래를 시작하는 데 몇 가지 좋은 이유를 제공했습니다.

  • 시간 초과 또는 잠금 모드를 설정합니다
  • 격리 레벨을 설정하십시오

표준 SQL은 현재 진행중인 트랜잭션이없는 경우 쿼리조차 새 거래를 시작해야합니다. 예를 들어 Autocommit 모드를 가진 DBMS가 있습니다 (예 : 명령문은 트랜잭션을 시작하여 즉시 명령문이 완료됩니다). 다른 DBMS는 기본적으로 Atomic (효과적으로 자동 커미트)을 명명하지만 다음 커밋 또는 롤백까지 Autocommit을 취소하는 '시작'과 같은 명시 적으로 명시 적 트랜잭션을 시작합니다 (IBM Informix Dynamic Server는 데이터베이스가 모드가 아닌 경우입니다. ANSI).

나는 결코 롤백하지 않는 조언에 대해 확신하지 못한다. 그것은 읽기 전용 트랜잭션에 아무런 차이가 없으며, DBA를 괴롭히는 정도까지 롤백을 피하는 것이 좋습니다. 그러나 프로그램이 커밋하지 않고 종료되면 DBMS는 불완전한 트랜잭션에 대한 롤백을 수행해야합니다. 데이터베이스를 수정 한 경우에도 데이터 만 선택한 경우에도 (단순화) 데이터 만 수행해야합니다.

전반적으로, 일련의 운영의 기본 동작을 변경하려면 트랜잭션이 읽기 전용하더라도 트랜잭션을 사용하십시오. 기본 동작에 만족하는 경우 거래를 사용하는 것이 중요하지 않습니다. 코드가 DBMS 사이에 휴대 할 수있는 경우 거래가 필요하다고 가정하는 것이 가장 좋습니다.

다른 팁

우선, 이것은 조기 최적화처럼 들립니다. Steven이 지적했듯이, 대부분의 Sane 데이터베이스는 어쨌든 당신을 거래에 참여시킬 것이며, 그들이 실제로하고있는 모든 일은 각 진술 후 Commit에게 전화하는 것입니다. 따라서 이러한 관점에서 볼 때 각 명령문은 새로운 트랜잭션을 시작해야하기 때문에 AutoCommit은 성능이 떨어질 수 있습니다. 아니면 아닐 수도 있습니다. 벤치마킹 만 말하면 응용 프로그램에 차이가 하나도 없다고 생각합니다.

항상 거래를 사용하려는 한 가지 이유는 보호의 일관성 때문입니다. "필요한"경우에만 거래를 수동으로 선언하면서 피드를 시작하면 중요한 시간에 잊어 버릴 것입니다. 또는 나중에 프로그래머가 그것이 사실을 인식하지 못했거나 코드가 숨겨진 쓰기가있는 함수를 호출하기 때문에 읽기 전용 작업 세트가 갑자기 그렇지 않을 것입니다. 예를 들어, 명령 줄 데이터베이스 클라이언트가 자동 커미트하지 않도록 구성합니다. 즉, 손가락으로 삭제 쿼리와 롤백을 할 수 있습니다.

지적한대로 격리 수준이 있습니다. 이를 통해 다른 프로세스가 데이터에 대한 데이터를 효과적으로 원자체로 작성한 경우 걱정없이 여러 읽기를 수행 할 수 있습니다. 이렇게하면 레이스 조건을 디버깅하는 한 시간 동안 당신을 절약 할 수 있습니다.

그리고 마지막으로, 종종 거래를 읽기 전용으로 설정할 수 있습니다. 이것은 당신의 가정을 확인하고 무언가가 글을 쓰려고하는 경우 오류가 발생합니다.

다음은 모든 것을 합산하는 멋진 기사입니다. 세부 사항은 Oracle에 따라 다르지만 개념은 일반적입니다.

기본 타임 아웃 이외의 쿼리에 대한 특정 시간 초과를 설정하거나 격리 수준을 변경하려는 경우 읽기 전용 작업에는 트랜잭션이 필요합니다.

또한 예외에 대해 알지 못하는 모든 데이터베이스는 각 쿼리마다 내부적으로 트랜잭션을 시작합니다. 롤백이 필요하지 않은 경우 롤백 거래에 대해서는 일반적으로 고려됩니다.

DBA는 롤백 활동을 모니터링 할 수 있으며이 경우 기본 롤백 동작이이를 귀찮게합니다.

따라서 트랜잭션은 어쨌든 시작 여부에 관계없이 사용됩니다. 필요하지 않은 경우 시작하지 말고 읽기 전용 작업에서 롤백을하지 마십시오.

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