2010-07-28 2 views
2

I은 ​​멀티 스레드 환경DB가 후속 트랜잭션을 위해 다른 행을 반환하도록 만드는 방법은 무엇입니까?

  1. 개시 트랜잭션
  2. 검사 DB 일부 조건에서 (열 기반으로) 위쪽 행
  3. 판독 n 개의
  4. 업데이트 그 세트 내의 다음 흐름을
  5. 커밋 행으로/I이 m을 처리하기 위해 낙관적 잠금을 사용하고 트랜잭션

롤백 궁극적 인 스레드 시나리오이지만 위의 상황에서 DB는 항상 동일한 행 집합을 반환하므로 두 번째 스레드가 동시에 실행되면 항상 실패합니다.

더 나은 방법이 있나요? 일부 옵션을 사용하여 DB가 각 트랜잭션에 대해 다른 행 집합을 반환하도록 할 수 있습니까?

+0

다른 방법이 있습니까? – Reddy

답변

1

귀하의 모든 스레드 같은 상위 n 기록을 얻고있는 이유 때문에 거래의 i를 ACID (원 자성, 일관성, 격리, 영속성)에서 원칙이다. 격리는 다른 작업이 아직 완료되지 않은 트랜잭션 중에 수정 된 데이터에 액세스 할 수 없음을 의미합니다. 따라서 스레드가 트랜잭션을 커밋 할 때까지 다른 스레드는 자신이 수행 한 작업을 볼 수 없습니다.

는 다음 중 하나에 대부분의 데이터베이스에 Isolation level을 변경할 수 있습니다 :

  • SERIALIZABLE
  • REPEATABLE READ
  • READ
  • 이 UNCOMMITTED READ COMMITTED

귀하의 경우에는 아마 다음을 읽어야합니다. 다른 트랜잭션에 의해 커밋되지 않은 변경 사항을 볼 수 있습니다.

참고 : 대부분의 응용 프로그램에서는 거의 확실하게 격리 수준이 잘못되어 데이터가 손상 될 수 있습니다. 여기에서 설명한 것과 다른 다른 응용 프로그램이 동일한 데이터베이스에 액세스하는 경우 응용 프로그램이 예상치 못한 잘못된 동작을 보게 될 수 있으므로 격리 수준을 변경하지 않으려 고합니다.

+0

감사합니다 Tendayi. – Reddy

관련 문제