2013-10-29 5 views
0

그래서 여기에 동기화 문제가 있습니다. 의 상황을 설명하자PostgreSQL이 여러 사용자와 공유 테이블을 잠급니다.

id sending_object_id type destinatary 

ID가 자동 일련 ID PostgreSQL은 각 테이블에 제공됩니다

나는이 열로 구성 Sendings라는 테이블을 가지고있다. 보내는 object_id는 사용자 지정 식별자이며 형식 및 destinatary ...이 특정 질문에 대해 정말로 중요하지 않습니다.

테이블 데이터와 같을 것이다 방법의 예입니다 :

id sending_object_id type destinatary 
    1   1    1   A7 
    2   1    1   B1 
    3   2    2   A1 
    4   2    2   A2 
    5   3    1   B8 
    6   4    1   N1 

같은 당신이 볼 수있는 "object_id은"여러 destinataries 보낼 수 있습니다. 이제 두 개의 서로 다른 컴퓨터를 사용하는 두 명의 서로 다른 사용자가을 새로 보내는 을 삽입하려고하면 동기화 문제가 발생합니다.

사용자 A은 새 송신 정보를 도입하고 DB 엔진은 SelectMax(sending_object_id)을 작성하여 레지스트리에 대한 새 sending_object_id를 작성합니다.

동시에 사용자 B는 새로운 만들고, 전송 소개 다른 SelectMax(sending_object_id).

동시에, 새로운 데이터를 삽입 할 때 내가 sending_object_id의 중복 피할 수있는 방법

?

미리 감사드립니다.

답변

1

새 sending_object_id를 만드는 동안 테이블을 잠글 수도 있고, 번호가 무엇인지 정확하게 지정하지 않으면 자신의 sequence을 작성하고 nextval을 호출 할 수도 있습니다.

+0

테이블을 잠그는 더 좋은 방법은 무엇입니까? 그리고 시퀀스를 작성하면 첫 번째 삽입에만 호출 할 수 있습니까? (sending_object_id는 동일한 일련의 전송에 대해 반복 될 수 있음). 사전에 감사드립니다 –

+1

배치의 시작 부분에서 응용 프로그램의 nextval()을 호출하면 결과를 무시하고 삽입에 currval()을 사용합니다. 그런 식으로 그들은 모두 새로운 (동일한) 가치를 지닙니다. –

1

여기에 sequences을 사용해야한다고 생각합니다. 어떤 경우 든 고유 한 것으로 보장됩니다.

+0

시퀀스의 nextval과 같은 질문은 sending_id 세트의 첫 번째 삽입에 대해서만 호출 할 수 있습니까? 미리 감사드립니다. –

+1

예. 필요할 때만 부를 수 있습니다. 또는 column의 디폴트 값으로 그냥'nextval ('sequence_name')'을 쓸 수도있다. 그래서 첫 번째 insert는'default' 값을 가지며 다른 모든 것은 같은 수를 갖습니다 (insert 질의에서'RETURNING id' 절을 사용하여 얻을 수 있습니다). – alexius

관련 문제