2014-04-18 3 views
2

Firebird 데이터베이스에서 다른 데이터베이스로 복제를 개발하려고했습니다. replication_flag이라는 테이블에 새 필드를 추가하기 만하면됩니다.다른 필드에서 데드락 락 업데이트가 발생했습니다.

내 복제 프로그램이 읽기 커밋 된 트랜잭션을 시작하고 행을 선택하고 replication_flag 개의 행 필드를 업데이트 한 다음 커밋하거나 롤백합니다.

내 프로덕션 클라이언트가이 replication_flag 필드를 업데이트하지 않고 커밋 된 읽기를 사용합니다. 복제 클라이언트는이 replication_flag 필드 만 업데이트하고 다른 필드는 업데이트하지 않습니다.

여전히 죽은 잠금이 표시되고 이유를 알 수 없습니다. 데드 록은 어떻게 피할 수 있습니까?

+2

용어 _deadlock_ 여기에 잘못된 이름의 비트가 실제로 업데이트 충돌입니다. Firebird에서'no_rec_version' 옵션을 read committed ('rec_version '과 반대)와 함께 사용하면이 오류가 더 많이 발생하기 때문에 정확한 트랜잭션 옵션을 지정할 수 있습니다. 또한 염두에 두십시오 : 단 하나 분야가 바뀌더라도, 이것은 전체 레코드가 새로운 버전을 얻었다는 것을 의미합니다! –

+0

@MarkRotteveel, 도와 주셔서 감사합니다. 그래서, 내가 이해하는 한, 나는 rec_version을 포함하는 또 다른 것으로 고립시켜야한다. 나는 그것을 시도 할 것이다. –

+1

명확하게하기 위해 양쪽 모두 커밋 된 읽기가 있지만 일부 드라이버는 기본값으로 no_rec_version을 사용하므로이 오류가 발생할 확률이 높아집니다. –

답변

1

복제 응용 프로그램은 각 테이블의 각 레코드를 업데이트하는 대규모 트랜잭션을 사용하는 것으로 보입니다. 아마도 결국 전체 데이터베이스가 "잠겨"있습니다.

테이블 또는 레코드 패킷에 의한 트랜잭션 사용을 고려해야합니다. 읽기 전용 트랜잭션을 사용하여 읽을 수도 있고 다른 트랜잭션을 사용하여 자주 커밋하여 다른 트랜잭션이 레코드를 갱신 할 수 있도록 작성할 수도 있습니다.

흥미로운 슬라이드 쇼 : http://slideplayer.us/slide/1651121/