2010-08-04 3 views
0

트랜잭션에서 1에서 3 개의 테이블을 업데이트하는 35 개의 함수가 있습니다. 그러나 업데이트 만 실행하는 것이 아니라 쿼리도 수행합니다.oracle 및 innodb를 사용하여 시나리오에서 테이블 교착 상태를 최소화하십시오.

  • 표 1은 행 업데이트 전용 작업 및 일부 쿼리를 수행합니다.
  • 표 2는 기존 행에 대한 쿼리 및 행 수준 업데이트를 수행하며 때로는 행을 삭제하고 추가합니다. 표 2는 행 삭제 및/또는 삽입 및/또는 업데이트 전과 후에 트랜잭션 내에서 쿼리를 가질 수 있습니다.
  • 표 3은 위의 ​​표 2 작업 결과를 기반으로 행을 업데이트합니다.

첫 번째 작업은 테이블 3의 업데이트가 모두 끝났음을 확인하는 것입니다.

표 1은 다른 2 테이블과 독립적이며 아마도 첫 번째 또는 마지막 일 수 있습니다. 표 2는 표 3이 변경되기 전에 나와야합니다.

첫 번째 관심사는 표 2 작업에서 쿼리를 수행 한 다음 업데이트를 수행 한 다음 더 많은 쿼리를 수행 한 다음 때로는 더 많은 업데이트를 수행하는 것입니다. 이 작업을 수행하지 않도록 코드를 재구성해야합니까?

두 번째 문제점은 표 3이 서블릿 스레드가 빠르다는 점입니다. 표 3은 단순히 쿼리 자체에 사용됩니다. 하지만 그것은 행 수준의 잠금이 이러한 쿼리를 중지시키는 것처럼 보입니다.

내가해야 할 경우, 위에서 설명한 테이블 세트 유지 관리 코드를 하나의 스레드에서 단일 클러스터 전체 프로세스로 넣을 수 있습니다. 업데이트 속도는 중요하지 않습니다. 테이블 3에 대한 쿼리는 빠릅니다. 그리고 결코 교착 상태가 발생하지 않습니다.

오라클과 Innodb의 차이점을 모르겠다. 질문이있다. (나중에 오라클로 업그레이드 할 예정입니다.)

기본적으로, 나는주의해야 할 점에 대한 포인터를 찾고 있습니다. 물론, 나는 각 테이블 업데 이터 함수의 시작 부분에서 테이블 2와 그 다음 테이블 3에 대한 전체 테이블 잠금을 강제로 수행 할 수 있지만, 그런 다음 내 Table3 서블릿 쿼리 스레드는 영향을 받게됩니다. 그래서 그것은 해결책처럼 보이지 않습니다.

또한 테이블 2와 관련하여 일부 기능은 쿼리를 기반으로하고 업데이트를 기반으로하는 새로운 쿼리와 테이블에 대한 업데이트를 통한 결과 흐름을 포함하여 더 많은 업데이트에 대해 걱정하고 있습니다. 3. 이것은 정말 불쾌한 것 같습니다.

권장 사항? Andy

두 테이블의 동일한 행에 대한 동시 업데이트가있을 수 있으며 같은 순서로 업데이트 된 테이블에주의를 기울였습니다. 테이블 중 하나에는 2 개의 인덱스가 있으며 인덱스를 업데이트하려면 테이블 잠금이 필요합니까? 일부 함수 조회 테이블 1, 갱신 테이블 1, 선택적으로 테이블 2 조회 후 반복 루프에서 테이블 2를 갱신합니다. 이 테이블은 내 모든 콘텐츠의 트리에서 모든 상위 하위 관계를 보유하므로 모든 사용자에 대해 많은 양의 업데이트가 이루어집니다.

답변

2

첫 번째로, FOR UPDATE를 사용하지 않는 한 Oracle (및 InnoDB는)의 쿼리는 잠금을받지 않습니다.

두 번째로, 귀하의 응용 규모에 대해 전혀 알지 못합니다. 동시 트랜잭션 수는 얼마나 될 것으로 예상합니까? 당신은 그들이 같은 행을 업데이 트하는 기대합니까?

교착 상태에 시달릴 수있는 응용 프로그램의 종류는 예약 또는 발권 시스템 (예 : 극장에서 같은 좌석을 예약하려는 사람들)입니다. 특히 높은 동시성 상황 (새 프로그램 예약시 사용 가능)이됩니다.

응용 프로그램이이 프로파일에 적합한 경우, 교착 상태 상황을 예상하고 싶을 것입니다. 그러나 적어도 오류를 트래핑하고 롤백 한 다음 트랜잭션을 다시 시도하는 것이 좋습니다. 테이블 구조, 관계 및 업데이트 기준에 대한 자세한 내용을 살펴보면 적절한 잠금 지점이 분명해질 수 있습니다.

+0

+1 현명한 조언 – APC

관련 문제