2010-06-17 5 views
3

나는 테이블 B의 총 사용자 수를 유지하는 테이블 A를 가지고 있습니다. 테이블 A의 카운트는 테이블 B의 사용자 수와 일치합니다.트리거는 비동기식입니까?

그래서, 표 B의 사용자, 사용자 삽입 또는 삭제에 따라 카운트가 증가/감소되도록합니다.

두 가지 방법이 있습니다. - a) 표 B에 행을 삽입하는 경우 하나의 저장 프로 시저에서 표 A의 업데이트 개수를 발행 할 수 있습니다. 이 결과로 두 개의 명령이 삽입되고 그 뒤에 update가옵니다. 따라서 2 초 정도 걸립니다. (각 txn을 1 초로 가정)

b) 저장 프로 시저에 삽입 명령을 쓸 수 있습니다. 또한 표 A의 삽입이 완료된 후 표 A에서 계수를 갱신하는 트리거를 정의하십시오. 나에게 이것은 단지 표 B에 행을 삽입하는 것인데 1 초의 시간이 걸릴 것이다. 표 B에서 카운트를 업데이트하는 '삽입 트리거'가 백그라운드에서 발생하므로 비동기식 또는 비 차단 형인 것으로 생각된다.

이 가정은 맞습니까? 아니면 두 접근법이 모두 같은 시간이 걸릴 것입니다.

참고 : 테이블 A의 업데이트 횟수에 신경을 쓰지 않습니다. 따라서 큐에서와 같이 비 차단 모드에서 동기화 작업을 수행하는 방법을 찾고 있습니다!

의견이나 제안이 있으십니까?

+0

옵션 C)보기를 사용하고 모든 트리거 또는 삽입을 회피합니다/넌센스 업데이트 –

+0

1 초 (또는 1 밀리 초)의 트랜잭션이있는 경우 다른 곳에서 큰 문제가 발생합니다. – dkretz

답변

7

아니요, 트리거는 저장 프로 시저와 동일한 방식으로 절대적으로 동 기적으로 실행됩니다. 즉, 트리거에서 카운트를 업데이트하는 등의 작업을 시작하면 자동 커밋을 사용하여 간단한 쿼리를 트랜잭션에서 많은 작업을 수행하도록 만들 수 있으므로 교착 상태가 발생할 가능성이 큽니다. 당신은 이것을 알고 있어야합니다.

동기화하지 않으려면 보류중인 변경 테이블에 삽입 한 다음 업데이트하는 비동기 프로세스가 있어야한다고 생각합니다. 이것은 아마도 장기간에 많은 교착 상태를 피할 것입니다 (보조 인덱스가없는 테이블에 삽입하면 AFAIK 같은 테이블에 다른 삽입으로 교착 상태가 될 수 없습니다)

관련 문제