Firebird 데이터베이스에서 다른 데이터베이스로 복제를 개발하려고했습니다. replication_flag
이라는 테이블에 새 필드를 추가하기 만하면됩니다.다른 필드에서 데드락 락 업데이트가 발생했습니다.
내 복제 프로그램이 읽기 커밋 된 트랜잭션을 시작하고 행을 선택하고 replication_flag
개의 행 필드를 업데이트 한 다음 커밋하거나 롤백합니다.
내 프로덕션 클라이언트가이 replication_flag
필드를 업데이트하지 않고 커밋 된 읽기를 사용합니다. 복제 클라이언트는이 replication_flag
필드 만 업데이트하고 다른 필드는 업데이트하지 않습니다.
여전히 죽은 잠금이 표시되고 이유를 알 수 없습니다. 데드 록은 어떻게 피할 수 있습니까?
용어 _deadlock_ 여기에 잘못된 이름의 비트가 실제로 업데이트 충돌입니다. Firebird에서'no_rec_version' 옵션을 read committed ('rec_version '과 반대)와 함께 사용하면이 오류가 더 많이 발생하기 때문에 정확한 트랜잭션 옵션을 지정할 수 있습니다. 또한 염두에 두십시오 : 단 하나 분야가 바뀌더라도, 이것은 전체 레코드가 새로운 버전을 얻었다는 것을 의미합니다! –
@MarkRotteveel, 도와 주셔서 감사합니다. 그래서, 내가 이해하는 한, 나는 rec_version을 포함하는 또 다른 것으로 고립시켜야한다. 나는 그것을 시도 할 것이다. –
명확하게하기 위해 양쪽 모두 커밋 된 읽기가 있지만 일부 드라이버는 기본값으로 no_rec_version을 사용하므로이 오류가 발생할 확률이 높아집니다. –