2012-10-10 3 views
6

Azure Blob 저장소에 파일을 저장하고 싶습니다. 여태까지는 그런대로 잘됐다. 또한 파일에 대한 추가 메타 데이터를 저장하고 싶습니다. Azure SQL 데이터베이스를 사용하기 때문에 BLOB 저장소에있는 파일을 쉽게 쿼리 할 수 ​​있습니다.Azure Blob 저장소의 트랜잭션 액세스

그래서 저장소에 새 파일을 추가 할 때 blob과 메타 데이터가 성공적으로 기록되었음을 확인하고 싶습니다. 그래서 트랜잭션 컨텍스트와 같은 것을 사용하는 것이 내 마음에 온다.

BLOB 저장소와 SQL 저장소를 사용하여 트랜잭션 컨텍스트를 만드는 방법이 있습니까?

답변

5

내가 아는 한이 작업을 수행하는 기본 제공 기능은 없습니다. 직접 관리해야합니다. 가장 간단한 시나리오는 blob을 먼저 저장 한 다음 데이터베이스 레코드를 추가하는 것입니다. 데이터베이스는 사용자의 필요에 대한 인덱스 역할을하기 때문에 Blob은 데이터베이스 레코드가 저장 될 때까지 코드에서 본질적으로 보이지 않습니다.

더 많은 옵션은 사용자 자신의 커밋 로직을 구현하는 것입니다. 예를 들어 레코드에 플래그를 0으로 설정하여 Blob을 저장하고 데이터베이스의 플래그를 1로 설정하면 데이터베이스의 플래그를 1로 설정합니다.

메타 데이터를 Azure 테이블에 저장할 수도 있습니다. Azure 테이블에서 검색하는 것은 많은 레코드가있는 경우 상당히 느려질 수 있습니다. SQL 데이터베이스에서 검색하는 것이 가장 빠를 것입니다.

당신이 선택하는 접근 방식은 당신의 목표에 달려 있지만, 첫 번째 옵션이 가장 간단하다고 생각합니다.

1

존재하는 BLOB는 무해하지만 존재하지 않는 BLOB를 가리키는 데이터베이스 레코드는 좋지 않습니다. 따라서 다음 논리를 사용하여 트랜잭션을 구현할 것입니다.

작성시 ... blob을 먼저 추가 한 후 데이터베이스 레코드를 작성하십시오. BLOB 업로드가 실패하면 그냥 반환하십시오. blob 업로드가 성공했지만 데이터베이스 레코드가 실패하면 blob을 삭제하고 리턴하십시오. 요점은 성공적으로 blob을 업로드 한 후에야 데이터베이스 레코드를 생성하기를 원하지 않는다는 것입니다. 또한 데이터베이스 레코드를 업데이트 할 수없는 경우 BLOB를 정리하려고합니다. BLOB 정리가 실패하면, 참조되지 않은 얼룩을 정리하기 위해 주기적으로 실행되는 서비스가 있습니다. 은 단지보다 오래 전에 생성되었으므로 데이터베이스 레코드의 업로드와 생성 중 하나를 삭제하려고 시도하지 않습니다.

제거시 ... 데이터베이스 레코드를 먼저 삭제하십시오. 실패하면 그냥 반환, blob 및 데이터베이스 레코드가 모두 여전히 있습니다. 데이터베이스 레코드가 삭제 된 경우 BLOB는 그곳에 남아 있으면 아무 것도 아프지 않으므로 즉시 삭제하거나 정리 서비스를 위해 나중에 남겨 둘 수 있습니다.