2012-10-14 1 views
2

InnoDB 엔진을 사용하여 동일한 MySQL 데이터베이스 서버를 공유하는 Ruby on Rails를 실행하는 두 개의 애플리케이션 서버가 있습니다.ID, 가능한 데이터베이스 MySQL 트랜잭션 문제를 건너 뛰는 레일?

때때로 부하가 심할 때 레코드의 ID가 Users, X 및 Y 테이블에서 건너 뛰고 순차적이지 않은 것으로 나타납니다.

이것은 의사 코드 : 모든 어떻게든지에 관련된

user = Create user x in table Users 

user_x = Find user x 

Insert a tuple into an auxiliary table X 

Insert a tuple into an auxiliary table Y 

Update the tuple that was inserted in table X 

Insert a tuple into an auxiliary table Z 

테이블 X, Y, Z, 나는 모든 레코드를 삭제하고 있지 않다.

그러나로드 된 ID가 과부하 일 때 한두개 건너 뛰기도하는 경우가 있습니다.

이 사건과 관련하여 거래가 도움이 되겠습니까?

Start transaction 

    user = Create user x 

    user_x = Find user x 

    Insert a tuple into an auxiliary table X 

    Insert a tuple into an auxiliary table Y 

    Update the tuple that was inserted in table X 

    Insert a tuple into an auxiliary table Z 

Commit 

Noobie 질문,이 코드는로드가없는 경우에는 잘 작동하지만로드가있는 경우에는 정상적으로 작동합니다. 즉 동일한 시간에 동일한 자원을 여러 사용자가 사용하면 위의 상황이 발생합니다. 거래가 도움이 될까요?

트랜잭션 블록에 모든 것을 래핑하는 데 어떤 단점이 있습니까?

+0

수정 사항이 추가되었습니다. – Bill

+1

트랜잭션 추가는 자동 증가 값 건너 뛰기에 거의 영향을 미치지 않습니다. 그러나 사용자, X, Y 및 Z에 모두 삽입되거나 모두 실패하도록 레코드를 삽입해야하는 경우 트랜잭션이 필요합니다. –

답변

1

MYSQL에 대해서는 잘 모르겠지만 Postgres의 ID는 자동 증가 시퀀스에서 한 번만 할당되며 트랜잭션이 롤백되거나 중단되면 사용되지 않습니다.

일부 ID를 건너 뛰는 것이 문제인 이유는 무엇입니까? 그들에게 순차적으로 의존하는 것은 용의주하다.

사용자와 테이블 X, Y, Z간에 외래 키를 사용하고 있습니까? 아니면 관계가 병렬로 증가하는 ID에 의존합니까?

+0

ID는 응용 프로그램에 대해 순차적 일 필요는 없습니다. 행을 삭제하거나 ID를 업데이트하지 않고 건너 뛴 이유를보고 싶을 것입니다. 아니요. 외래 키를 사용하고 있지 않습니다. 레일스 애플리케이션은 데이터베이스 스키마 마이그레이션에서 외래 키를 사용하지 않습니다. – Bill

+0

@Bill 낮은 오버 헤드와 비 블로킹을 증가시키는 시퀀스를 만들기 위해 대부분의 데이터베이스 엔진은 연결에 값 덩어리를 할당합니다. 오류, 연결 끊기 또는 서버 재부트의 경우에는 건너 뛰고 자동 증가 값은 롤백되지 않습니다. –

+0

감사합니다. 질문에 대한 답이 제 질문에 대답했습니다. 또한 응용 프로그램 서버가 복제되는 환경에서 건너 뛴 ID를 보는 것이 일반적이라고 생각합니다. – Bill

관련 문제