2010-03-26 1 views
3

나는 온라인 파일 관리 프로젝트에서 일하고있다. 우리는 데이터베이스 (SQL 서버)에서 참조를 저장하고 파일 시스템에서 파일 데이터를 저장하고 있으며, 파일 시스템과 데이터베이스 간의 조정 문제에 직면하고있다. 우리는 파일을 업로드하는 중이고 파일을 삭제하는 경우에는 먼저 데이터베이스에 참조를 만들거나 파일 시스템에 파일을 저장합니다. 문제는 먼저 데이터베이스에 참조를 만든 다음 파일에 파일을 저장하는 경우 system.bur 파일 시스템에 파일을 저장하는 동안 어떤 종류의 오류가 발생합니다. 그 파일에 대한 참조가 데이터베이스에 있지만 파일 시스템에 파일 데이터가 생성되지 않습니다 ;; 그런 상황에 어떻게 대처할 수있는 해결책을 좀주세요.; 나는 그것을 필요로합니다.; 그 이유는 무엇입니까?두 데이터베이스 (파일 시스템과 RDBMS)의 원 자성을 보장하는 방법은 무엇입니까?

+0

중복 : http://stackoverflow.com/questions/2524899/how-to-bring-coordination-btween-file-system-and-databse – NealB

답변

0

실제로 생각보다 쉽습니다.

먼저 "단일 진실"을 결정해야합니다.

즉, 파일 시스템 또는 DB 중 어느 것이 든 특정 시점에서 정확합니까?

이유는 충돌을 쉽게 해결할 수 있기 때문입니다.

데이터베이스가 원본이고 파일 시스템이 데이터베이스의 섀도우라고 가정해야합니다. 이것은 직관적 인 것처럼 보입니다. 왜냐하면 파일 시스템에없는 경우 DB에 항목이 존재할 수 있기 때문입니다. 분명히 그것은 할 수 없습니다. 그러나 기본적으로 파일이 DB에 없다면 어쨌든 "존재하지 않습니다". 따라서 파일 시스템은 DB의 상태를 반영하고 다른 방향으로는 반영하지 않습니다.

이러한 가정하에, 이러한 충돌 해결 규칙이 생깁니다. 주어진 파일의 경우

:

File Exists DB Entry Exists Action 
    Yes   Yes   No action, normal state 
    No    Yes   Error -- missing file, "should never happen" 
    No    No    No action, normal state 
    Yes   No    Delete the file, but no error. 

파일을 업로드, 거기에 회색 영역이 존재 - 즉, 파일 업로드하지만 아직 DB에 의해 인정되지 않는 경우.

이 문제를 해결하려면 준비 모드에서 파일을 업로드해야합니다.

이 작업을 수행하는 가장 쉬운 방법은 파일을 다른 디렉터리에 있지만 동일한 실제 파일 시스템에 업로드하거나 임시 파일 이름을 사용하여 최종 위치에 업로드하는 것입니다. 어느 쪽이든, 파일은 이름이나 위치에 따라 "진행 중"인 것으로 쉽게 식별됩니다.

두 가지 이유로 동일한 파일 시스템에서이 파일을 "준비"하고 싶습니다. 하나, 디스크 공간.업로드 할 때 디스크가 채워지지 않으면 마지막 휴식 장소에 맞을 것입니다 (이미 스페이스를 "예약"했습니다). 둘째, 파일을 마침내 배치하면 해당 작업은 원자 적이어야합니다. 동일한 파일 시스템에 대한 파일 이름 변경 작업은 최신 파일 시스템에서 원초적입니다. 기본적으로 기존 파일을 "덮어 씁니다"(이름 바꾸기 작업 중에 원본이 삭제 된 경우에도) "반쪽 이름이 바뀐"파일을 가질 수 없습니다. 이름 바꾸기 파일 작업이 실패

Start DB transaction 
Rename file 
Add DB record 
Commit transaction 

경우 중단과 DB 트랜잭션, 따라서 항목을 롤백 :

일단 당신의 작업이되고, 개최. 이름 바꾸기가 성공하고 DB가 실패하면? 그런 다음 위에 나열된 국가 # 4가 있습니다. 업로드가 성공할 때까지 다시 시도하십시오.

파일을 삭제하려면 다음을 수행하십시오
Start DB Transaction 
Delete DB record 
Commit transaction 
Delete file from file system 

DB를 삭제하면

실패, 파일을 삭제하지 마십시오. DB 삭제가 성공하고 파일 삭제가 실패하면 상태 4로 돌아갑니다.

마지막으로 정기적으로 (매일, 매주, 기타) 데이터베이스를 파일 시스템과 비교하여 데이터베이스에없는 파일을 삭제하는 reaper 프로세스가 있습니다. DB가 "단일 소스의 진실"이기 때문에 결국 두 상점이 동기화됩니다.

DB 레코드가있는 파일이 누락되면 "데이터 손상"이 발생합니다. 그러지 마. 버그이거나 누군가 파일 시스템을 걷고 있습니다.

업로드 프로세스의 재시도 특성과 삭제 프로세스의 빠른 실패는 옳고 그른 것을 쉽게 확인하고 적절한 상태로 쉽게 수정할 수있는 의사 2 단계 커밋 프로세스를 제공합니다.

0

two phase commit을 작동 시키려면 데이터베이스 및 파일 시스템 트랜잭션을 모두 지원하는 트랜잭션 조정자가 필요합니다.

데이터베이스, 프로그래밍 언어 또는 플랫폼을 지정하지 않았으므로이 질문에 답을 할 수 있습니다.

0

Windows Vista, Windows Server 2008 이상 Windows OS에서는 use transactions to govern access to the NTFS이 가능합니다.

이 기능을 사용하면 .NET에서 프로그래밍하는 경우 System.Transactions 네임 스페이스를 사용하여 파일 시스템에 대한 업데이트와 데이터베이스에 대한 업데이트를 하나의 원자 단위로 수행 할 수 있습니다.

다른 OS에 트랜잭션 파일 시스템이 있는지 알 수 없습니다. 그렇다고 그들이 존재하지 않는다는 것을 의미하지는 않습니다.

관련 문제