2011-03-11 8 views
2

CAVEAT : 몇 년 전에이 문제가 발생했습니다. 나는 해결하려고하는 실제 문제를 잊어서 링크 된 목록과 관련된 이론적 인 문제로 대체했습니다.개체 그래프 및 READ_COMMITTED 트랜잭션 격리


지금 년 이상에 대한 READ_COMMITTED 트랜잭션 격리 수준을 사용하려고 봤는데 내가 경험의 나의 부족으로 인한 버그 매우이 좌절 얻고있다. 너희들이 여기서 내가 놓친 것에 대해 머리를 숙이 주면 고맙겠다.

거의 모든 응용 프로그램 논리를 단일 SQL 쿼리로 표현할 수 없습니다. 즉, 나는 거의 항상 객체 그래프를 걸어야 만합니다. 필연적으로 동일한 트랜잭션 내에서 일관성없는 상태가됩니다. 예를 들어, 데이터베이스에 단일 링크 된 목록을 저장하고 목록에 루프가 포함되어 있는지 알아 보려면 (아래에서 자세히 설명 함) 상상해보십시오. READ_COMMITTED에서이 작업을 수행 할 수있는 방법은 생각할 수 없습니다. 아웃 바운드 참조가 그래프를 걷는 동안 내 발 아래에서 업데이트 될 수 있기 때문입니다. READ_COMMITTED 작업은 단일 SQL 문을 사용하여 표현할 수있는 쿼리에 대해서만 볼 수 있습니다.

  • 는 처음 데이터베이스를 포함하는 데이터베이스 스키마가 Node[id, name, next_id]
  • 된다 A -> B -> C -> A

    1. 스레드 1 읽 D -> B -> C -> D
    2. 스레드 1 : A -> B은, B -> C
    3. 스레드 2가 데이터베이스를 업데이트 읽습니다. C -> D
    4. 스레드 1은 감지되었지만 루프가 없음을 감지합니다. A -> B -> C -> D를하지만 다음 루프 중 하나를 감지해야 :보기의 스레드 1의 관점에서 그것을 읽을 마이클 버그만의

A -> B -> C -> A 또는 D -> B -> C -> D

답변

0

응답 사의 씨 http://groups.google.com/group/h2-database/browse_frm/thread/8f253177e2b6c543?tvc=1

READ_COMMITTED_SNAPSHOT 격리 수준은 동시 작업으로 문제를 해결하는 데 도움이 될 수 있습니다. 다른 동시 트랜잭션의 영향을받지 않고 다중 쿼리 을 수행 할 수 있습니다.

당신은

  • 첫 임시 테이블로도

    • 복사 데이터 테이블을 잠그고 변경에 대한 업데이트를
    • 모니터 테이블을 방지 (트리거와 함께) 및 루프 감지시 변경이없는 경우 수 귀하의 결과가 유효하지 않을 수 있습니다, 그리고 당신은 멀리 던져 반복 검색을 반복 할 수 있습니다.루프 감지 데이터베이스가 지원하는 경우 은 아마 최고의 솔루션입니다 READ_COMMITTED_SNAPSHOT 격리 수준을 사용

  • 완료 될 때까지
  • 사용하는 응용 프로그램 로직은 변경 사항을 연기한다. 낮은 오버 헤드를 가지며 동시 트랜잭션을 차단하지 않습니다.

  • 관련 문제