2011-10-05 2 views
4

경우에 따라 코더는 원자 호출로 시스템 호출을 신뢰할 수 없습니다. 파일이 NFS 파일 시스템에있는 경우. (c.f. NFS Overview, FAQ and HOWTO Documents). 그러나 대부분의 데이터베이스 작업에는 원자 시스템 호출이 궁극적으로 필요합니다. (c.f. Atomicity of database systems)."쓰기"시스템 호출이 특정 파일에 대해 원자 적 (atomic)인지 프로그래밍 방식으로 결정하는 방법은 무엇입니까?

쓰기 (및 다른 syscalls)가 C (또는 파이썬)의 특정 FILE에 원자적임을 확인하는 표준 (및 OS 독립적 인) 방법이 있습니까?

제안 사항?

후속 노트 : 파이프에 자성은 다음에 설명되어 있습니다 :

주에서 - 특히 O_APPEND 구체적으로 다루는 "사람"페이지 추출물 :

파일 상태 플래그의 O_APPEND 플래그가 설정된 경우, 파일 오프셋은 각 쓰기에 앞서 파일의 끝으로 설정되어야하며 파일 오프셋과 쓰기 작업을 변경하는 사이에 파일 수정 작업을 수행하지 않아야합니다 (예 : ).

+2

데이터베이스가 원자 시스템 호출을 필요로하지 않는다는 것을 알게 될 것입니다 : 데이터베이스에 대한 원자 적 업데이트의 * 모양 *이 필요하지만 트랜잭션 로그를 사용하여 수행됩니다. 실제 데이터베이스 파일은 언제나 일관성이 없지만 트랜잭션 로그에는 일관성을 유지하는 데 필요한 정보가 들어 있습니다. – Duncan

+0

NFS는 단순히 깨지거나 부적합한 동작으로 가득차 있기 때문에 대부분의 경우 적합하지 않습니다. 심각한 네트워크 파일 시스템 사용에는 smb/cifs/9p/anything-but-nfs를 사용하십시오. –

+0

대부분의 데이터베이스가 취한 접근법은 * "NFS에서 실행하지 마십시오."*라는 줄에 따라 문서에 눈에 띄는 메모를 넣는 것 같습니다. *. – caf

답변

4

POSIX에 정의 된대로 write 호출에는 원자 성 보장이 전혀 없습니다. 따라서 아무 것도 확인하지 않아도됩니다. 원자가 아닙니다.

성공적으로 완료되면 데이터가 하드 드라이브에 도달했음을 보증하지 않습니다 (드라이브가있는 경우). 데이터를 성공적으로 다시 읽는 것으로는 어떠한 보증도 제공되지 않습니다.

일부 내구성을 얻으려면 sync 패밀리를 사용해야합니다.

+4

'write'는 파이프에 대해 몇 가지 원 자성을 보장하며 일반 파일에 대한 순서 보증을 제공합니다. –

+0

질문은 제목에 "파일"이라고 말하고 데이터베이스 작업에 대해 이야기합니다. 당신이 옳을 때, 나는 ACID 유형 작업에 대한 보증에 의존 할 수있는 것이 아닙니다. – Mat

관련 문제