2012-10-10 24 views
6

Me gustaría almacenar archivos en Azure Blob Storage. Hasta aquí todo bien. También me gustaría almacenar metadatos adicionales sobre el archivo; para eso uso una base de datos SQL de Azure (para poder consultar fácilmente los archivos en el almacenamiento de blobs).Acceso transaccional de Azure Blob Storage

Así que cuando agregue un nuevo archivo a la tienda me gustaría asegurarme de que tanto el blob como los metadatos se escribieron con éxito. Entonces me viene a la mente usar algo como un contexto de transacción.

¿Hay alguna manera de crear ese contexto de transacción usando almacenamiento de blob así como almacenamiento de sql?

Respuesta

5

No hay nada incorporado que haga esto hasta donde yo sé; Deberás gestionar esto tú mismo. El escenario más simple es guardar primero su blob y luego agregar el registro de su base de datos. Dado que la base de datos sirve como un índice para sus necesidades, el Blob es esencialmente invisible para su código hasta que se guarden los registros de la base de datos.

Una opción más complicada es implementar su propia lógica de compromiso. Manejaría una inserción de base de datos (con un indicador en el registro establecido en 0 por ejemplo), guardará la Blob y, si lo logra, establezca el indicador en la base de datos en 1.

También podría guardar los metadatos en Tablas Azure, aunque la búsqueda en Azure Tables puede disminuir significativamente si tiene muchos registros. La búsqueda en la base de datos SQL será más rápida la mayor parte del tiempo.

El enfoque que elijas depende de tus objetivos, pero creo que la primera opción es la más simple.

1

El blob existente es inofensivo, pero un registro de base de datos que apunta a un blob que no existe sería malo. Por lo tanto, implementaría la transacción con la siguiente lógica.

En la creación ... agregue la burbuja primero, luego cree el registro de la base de datos. Si falla la carga de blob, solo devuelve. Si la carga de blob tiene éxito, pero el registro de la base de datos falla, elimine el blob y regrese. El punto es que no querría crear un registro de base de datos hasta DESPUÉS de una carga de blob exitosa. También desea limpiar el blob si el registro de la base de datos no se pudo actualizar. Si falla la limpieza de blobs, solo tengo un servicio que se ejecuta periódicamente para limpiar blobs no referenciados creados más de una hora antes solo para que no intente eliminar uno entre la carga y la creación del registro de la base de datos.

Al eliminar ... Primero elimine el registro de la base de datos. Si eso falla, solo regrese, el blob y el registro de la base de datos seguirán allí. Si el registro de la base de datos se borra correctamente, el blob no está perjudicando nada quedándose allí, por lo que puede intentar eliminarlo inmediatamente o dejarlo para que un servicio de limpieza lo solucione más adelante.

Cuestiones relacionadas