2009-05-03 5 views
40

데이터베이스에서 트랜잭션을 사용하여 읽는 것과는 매우 다른 의견이있는 것 같습니다. developerWorks 기사 Transaction strategies: Models and strategies overview에서읽기 전용 DB 액세스를위한 트랜잭션?

인용구 :

왜 당신은 단지 데이터를 읽는 경우 트랜잭션을 필요? 대답은 입니다. 읽기 전용 작업을 수행하기 위해 거래를 시작하면 처리 스레드의 오버 헤드에 추가하고 (당신이 을 사용하고있는 데이터베이스의 종류와 어떤 격리 수준 설정에 따라 데이터베이스에 읽기 잠금을 공유 될 수 있습니다 to). 반대의 의견으로

최대 절전 모드의 문서에서 다음 인용문이 Non-transactional data access and the auto-commit mode

우리의 권고는 응용 프로그램에서 자동 커밋 모드를 사용하지 않는 것입니다

및 적용하는 읽기 전용으로 만 때 트랜잭션을 명백한 성능 또는 나중에 코드를 변경할 때 가능성은 매우 낮습니다. 항상 일반 ACID 트랜잭션을 사용하여 데이터를 읽거나 데이터를 쓰는 지 여부와 상관없이 데이터 액세스 작업, 을 그룹화하는 것이 좋습니다.

EclipseLink 메일 링리스트 here에 대해서도 비슷한 논쟁이 있습니다.

그래서 진실은 어디에 있습니까? 베스트 프랙티스를 읽는 거래는 있습니까? 둘 다 실행 가능한 솔루션이라면 트랜잭션을 사용하기위한 기준은 무엇입니까?

필자가 볼 수있는 한, 격리 수준이 '읽기 전용'보다 높으면 차이가 있습니다. 이 올바른지?

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

답변

16

스티븐 Devijver 트랜잭션을 시작하는 좋은 이유를 제공 현재 진행중인 트랜잭션이없는 경우 u 리조차도 u 트랜잭션을 시작해야합니다. 예를 들어 자동 커밋 모드를 가진 DBMS가 있습니다 (예 : 트랜잭션을 시작하고 명령문이 완료되면 즉시 커밋합니다). 다른 DBMS 문은 기본적으로 명령문을 원자 적으로 (사실상 자동 커밋) 만들지 만 'BEGIN WORK'와 같은 명령문을 사용하여 명시 적 트랜잭션을 시작하고 다음 COMMIT 또는 ROLLBACK 때까지 자동 커밋을 취소합니다 (IBM Informix Dynamic Server는 데이터베이스가 MODE가 아닐 때 ANSI).

롤백하지 말라는 충고에 대해서는 잘 모르겠습니다. 읽기 전용 트랜잭션에 아무런 차이가 없으며 DBA를 괴롭 히는 정도까지 ROLLBACK을 피하는 것이 좋습니다. 그러나 COMMIT을하지 않고 프로그램을 종료하면 DBMS는 불완전한 트랜잭션에 대해 ROLLBACK을 수행해야합니다. 확실히 데이터베이스를 수정 한 경우와 단순하게 데이터를 선택한 경우에도 마찬가지입니다.

전체적으로 일련의 작업의 기본 동작을 변경하려면 트랜잭션이 읽기 전용 인 경우에도 트랜잭션을 사용하십시오. 기본 동작에 만족하면 트랜잭션을 사용하는 것이 중요하지 않습니다. 코드가 DBMS 사이에서 이식되도록하려면 트랜잭션이 필요하다고 가정하는 것이 가장 좋습니다.

8

기본 시간 초과 이외의 다른 쿼리에 대해 특정 시간 초과를 설정하려는 경우 또는 격리 수준을 변경하려는 경우 트랜잭션이 읽기 전용이어야합니다.

또한 모든 데이터베이스 (예외에 대해 알지 못함)는 각 쿼리에 대해 내부적으로 트랜잭션을 시작합니다. 롤백이 필요하지 않은 경우 롤백 트랜잭션을 수행하지 않는 것이 일반적입니다.

DBA가 롤백 작업을 모니터링하고있을 수 있으며이 경우 모든 기본 롤백 동작으로 인해 문제가 발생할 수 있습니다.

그래서 시작 여부에 상관없이 트랜잭션이 사용됩니다. 필요하지 않은 경우 시작하지 말고 읽기 전용 작업에서는 롤백하지 마십시오.

  • 설정 시간 초과 또는 잠금 모드
  • 설정 격리 수준

표준 SQL이 필요합니다 작업은 데이터베이스를 읽어가는 경우에도

8

우선, 이것은 조숙 한 최적화처럼 들립니다. 스티븐 (Steven)이 지적한 것처럼, 대부분의 정상적인 데이터베이스는 당신을 트랜잭션에 넣을 것입니다. 그리고 그들이하는 일은 각각의 진술 후에 커밋 (commit)을 호출하는 것입니다. 이러한 관점에서, 각 명령문은 새 트랜잭션을 시작해야하기 때문에 자동 커미트가 덜 수행 될 수 있습니다. 아니면 아닐 수도 있습니다. 벤치마킹만으로도 알 수 있듯이 응용 프로그램과의 차이점이 하나도 없습니다.

항상 트랜잭션을 사용하려는 한 가지 이유는 일관성있는 보호입니다. "필요할 때"수동으로 트랜잭션을 선언하는 것으로 시작하면 중요한 시간을 잊어 버릴 것입니다. 또는 나중에 프로그래머가 그 코드가 있어야한다고 생각하지 않았거나 코드가 숨겨진 쓰기 기능을 호출했기 때문에 갑자기 읽기 전용 세트가 작동하지 않는다고 생각할 수도 있습니다. 예를 들어, 자동 커밋하지 않도록 명령 줄 데이터베이스 클라이언트를 구성합니다. 이것은 내가 핑거 삭제 쿼리와 롤백 할 수 있다는 것을 의미합니다.

지적 된 바와 같이 격리 수준이 있습니다. 이렇게하면 다른 프로세스가 데이터 사이에 데이터를 쓰면서 실제로 읽는 것을 걱정하지 않고 여러 번 읽을 수 있습니다. 이렇게하면 경쟁 조건을 디버깅하는 데 많은 시간을 절약 할 수 있습니다.

그리고 마지막으로 트랜잭션을 읽기 전용으로 설정할 수 있습니다. 이것은 당신의 가정을 검사하고 어떤 것이 쓰기를 시도하면 오류를 일으킬 것입니다.

Here's a nice article summing it all up. 세부 사항은 오라클에만 적용되지만 개념은 일반적인 것입니다.