트랜잭션에서 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를 갱신합니다. 이 테이블은 내 모든 콘텐츠의 트리에서 모든 상위 하위 관계를 보유하므로 모든 사용자에 대해 많은 양의 업데이트가 이루어집니다.
+1 현명한 조언 – APC