데이터베이스에서 트랜잭션을 사용할 때의 문제점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/60518

  •  09-06-2019
  •  | 
  •  

문제

에서 이 게시물.한 가지 분명한 문제는 확장성/성능입니다.트랜잭션 사용으로 인해 발생할 수 있는 다른 문제는 무엇입니까?

두 가지 문제 세트가 있다고 말할 수 있습니까? 하나는 장기 실행 트랜잭션이고 다른 하나는 단기 실행 트랜잭션입니다.그렇다면 어떻게 정의하시겠습니까?

편집하다:교착 상태는 또 다른 문제이지만 애플리케이션 도메인에 따라 데이터 불일치가 더 심해질 수 있습니다.거래 가치가 있는 도메인(정규적인 예를 사용하면 은행)을 가정할 때 교착 상태 가능성은 거래 사용 문제라기보다는 데이터 일관성을 보장하기 위해 지불하는 비용에 가깝습니다. 아니면 동의하지 않으시겠습니까?그렇다면 교착 상태가 없는 데이터 일관성을 보장하기 위해 어떤 다른 솔루션을 사용하시겠습니까?

도움이 되었습니까?

해결책

이는 데이터베이스 내부의 트랜잭션 구현에 따라 많이 달라지며 사용하는 트랜잭션 격리 수준에 따라 달라질 수도 있습니다.여기서는 "반복 읽기" 이상을 가정합니다.트랜잭션을 오랫동안 열어두면(아무것도 수정하지 않은 경우라도) 데이터베이스가 자주 변경되는 테이블의 삭제되거나 업데이트된 행(읽기로 결정한 경우를 대비해)을 유지하게 되며 그렇지 않으면 버려질 수 있습니다.

또한 트랜잭션을 롤백하는 데는 비용이 많이 들 수 있습니다.저는 MySQL의 InnoDB 엔진에서 대규모 트랜잭션을 롤백하는 것이 커밋하는 것보다 훨씬 더 오래 걸릴 수 있다는 것을 알고 있습니다(롤백에는 30분이 소요되는 것을 확인했습니다).

또 다른 문제는 데이터베이스 연결 상태와 관련된 것입니다.분산된 내결함성 애플리케이션에서는 데이터베이스 연결의 상태를 실제로 알 수 없습니다.상태 저장 데이터베이스 연결은 언제든지 실패할 수 있으므로 쉽게 유지 관리할 수 없습니다(애플리케이션은 작업 도중에 무엇을 했는지 기억하고 다시 실행해야 합니다).상태 비저장은 다시 연결될 수 있으며 (대부분의 경우) 상태 중단 없이 (원자적) 명령이 다시 실행되도록 할 수 있습니다.

다른 팁

명시적 트랜잭션을 사용하지 않고도 교착 상태가 발생할 수 있습니다.우선, 대부분의 관계형 데이터베이스는 실행하는 각 문에 암시적 트랜잭션을 적용합니다.

교착 상태는 기본적으로 여러 잠금을 획득함으로써 발생하며, 두 개 이상의 잠금을 획득하는 활동은 첫 번째 활동과 동일한 잠금을 두 개 이상 획득하는 다른 활동과 교착 상태에 빠질 수 있습니다.데이터베이스 트랜잭션에서 획득한 잠금 중 일부는 그렇지 않은 경우보다 오랫동안, 즉 실제로 트랜잭션이 끝날 때까지 유지될 수 있습니다.잠금이 오래 유지될수록 교착 상태가 발생할 가능성이 커집니다.이것이 바로 오래 실행되는 트랜잭션이 짧은 트랜잭션보다 교착 상태가 발생할 확률이 더 높은 이유입니다.

트랜잭션과 관련된 한 가지 문제는 DB에서 교착 상태가 발생할 수 있다는 것입니다(가능성은 낮지만 가능함).이러한 흥미롭고 실망스러운 문제를 디버깅하려면 데이터베이스가 작동하고, 잠기고, 거래되는 방식 등을 이해해야 합니다.

-아담

가장 큰 문제는 디자인 수준에 있다고 생각합니다.내 애플리케이션 내에서 어떤 수준에서 트랜잭션을 활용합니까?

예를 들어 다음과 같이 할 수 있습니다.

  • 저장 프로시저 내에서 트랜잭션을 생성하고,
  • 데이터 액세스 API(ADO.NET)를 사용하여 트랜잭션 제어
  • 애플리케이션에서 더 높은 수준의 암시적 롤백 형태를 사용합니다.
  • (DTC / COM+를 통한) 분산 트랜잭션.

동일한 애플리케이션에서 이러한 수준 중 하나 이상을 사용하면 성능 및/또는 데이터 무결성 문제가 발생하는 경우가 많습니다.

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