특정 USB 키가 연결되어있을 때 실행되는 Windows 서비스를 만들고 있습니다. 간단한 설명 : FTP 서버에 문의하여 파일을 다운로드하고 ) 아카이브를 USB에 저장합니다. 보관소는 클라이언트에 제공되는 도구를 사용하여 읽기 전용 으로 열 수 있습니다 (그러나 내 문제와 관련 없음).트랜잭션 기반 보관 컨테이너
서비스는 USB를 마스터 서버 (Dropbox와 거의 비슷하지만 다운로드 만하고 동기화 된 폴더는 이동식 미디어에 있음)와 동기화되도록 유지하는 데 사용됩니다. 아카이브는 몇 기가 바이트까지 커질 수 있습니다. 매주 약 1GB의 파일이 약 400 명의 사용자 키로 업데이트됩니다.
전체 업데이트 프로세스가 사용자에게 투명하므로 무시할 수없는 기회가 있습니다. 데이터가 아카이브에 기록 될 때 USB를 뽑습니다. 을 입력하지 마십시오. 아카이브를 손상 시키려면 다시 다운로드해야합니다. 즉, 이미로드 된 서버에서 상당한 대역폭을 낭비하게됩니다.
그래서 기본적으로 나는 트랜잭션을으로 처리해야합니다. 컨테이너가 일관성없는 상태가되지 않는 한 실패하면 정상입니다. 파일이 모두 작성되었거나 이 아니거나이 아닙니다. 컨테이너가 실제로 "보지 않으면"파일이 부분적으로 쓰여진다면 괜찮습니다.
질문은 여기에 있습니다 : 언제나 데이터 일관성을 어떻게 보장 할 수 있습니까? 특히 IO 작업을 트랜잭션으로 사용하려면 어떻게해야합니까? 너는 무엇을 제안 하겠는가? 혼자서 뭔가를 구현해야합니까? 아니면 이미이 기능을 제공하는 컨테이너가 있습니까?
이것은 내가 지금까지있어 무엇 :
- 가, 새 아카이브를 생성 커밋에 이름을 바꿉니다 가능하지, 아카이브가 너무 큽니다.
- 우편/타르/7Z : 적합, 실패한 쓰기 손상됩니다 아카이브
- TrueCrypt를 : 적합, 그것은 파일 시스템 드라이버 (사용자가 하지는이 점 관리자 권한)을 필요로한다.
- 파일 시스템을 파일에 매핑해야하는 모든 것 : 부적절합니다. 관리자가 아니면 불가능하지 않을 수도 있습니다. 가능하다면 좋을 것입니다.
- SQLite DB에 파일 저장 : 실제로 ACID이므로 솔루션이 될 수 있습니다. 그러나 SQLite는 BLOB 용량이 제한되어 있기 때문에 파일을 분할해야합니다. 별로 우아하지는 않지만 그렇게 할 준비가되었습니다. 또한 SQLite의 트랜잭션 저널은 큰 얼룩을 저장할 때 상당히 커질 수 있습니다.
- 직접 구현하십시오. : 가능한 한 많이 피하는 것이 좋지만 두려워하지는 않습니다. 나는 주제가 꽤 복잡하다는 사실을 발견했다.
이 질문이 너무 일반적인 경우 SU로 이동하십시오.
USB는 NTFS로 포맷 되었습니까? – Fanael
@Fanael 그렇습니다. 그렇지 않으면 아카이브가 어쨌든 적합하지 않습니다. –
이 경우, Vista 이상에만 관심이 있다면 아마도'CreateFileTransacted'와 그 친구들을 시도해야할까요? – Fanael