2010-03-26 9 views
6

Estoy trabajando en un proyecto de administración de archivos en línea. Estamos almacenando referencias en la base de datos (servidor sql) y archivos de datos en el sistema de archivos.¿Cómo llevar la coordinación entre el sistema de archivos y la base de datos?

Estamos enfrentando un problema de coordinación entre el sistema de archivos y la base de datos mientras cargamos un archivo y también en el caso de eliminar un archivo. Primero creamos una referencia en la base de datos o almacenamos archivos en el sistema de archivos.

El problema es que si primero crea una referencia en la base de datos y luego almacena un archivo en el sistema de archivos, pero mientras almacena archivos en el sistema de archivos aparece cualquier tipo de error, la referencia para ese archivo se crea en base de datos pero no existen datos de archivos en el sistema de archivos.

Por favor, dame alguna solución sobre cómo manejar esa situación. Estoy muy necesitado de eso.

¿Este caso ocurre también mientras borramos un archivo?

+0

Un sistema de archivos se puede considerar como un tipo particular de base de datos, aunque uno que no utiliza SQL, y está particularmente ajustado para almacenar blobs. Entonces, en cierto sentido, se pregunta cómo garantizar la atomicidad en dos bases de datos (el sistema de archivos y su RDBMS). ¿Es posible diseñar su sistema para que solo use uno u otro? – Will

+0

no, estamos utilizando RDBMS para almacenar referencias y el sistema de archivos para almacenar archivos de datos/archivos del cuerpo? –

+0

La respuesta obvia es hacer las cosas al revés: las bases de datos tienden a ser mucho menos propensas a fallar una operación que los sistemas de archivos. –

Respuesta

0

Tratar los dos eventos (administrar la referencia y administrar el archivo) como una sola transacción. Si alguno falla, respalde el otro. Entonces deberías encontrar difícil entrar en una situación donde los dos no están sincronizados. Es más fácil deshacer las operaciones de la base de datos que las operaciones del sistema de archivos.

5

El acceso al sistema de archivos no es de hecho transaccional. Tendrá que simular una transacción all-or-nothing distribuida usted mismo: si la confirmación en la base de datos falla, elimine el archivo en el sistema de archivos. Inversamente, si el archivo de escritura falla, revertir la transacción de la base de datos (Eso será un poco más complicado, pero eso es un boceto aproximado).

Tenga en cuenta que puede ser bastante complicado cuando se actualiza un archivo. Primero debe copiarlo, de modo que si la transacción de la base de datos falla después de haber sobrescrito el archivo, aún puede restaurar la versión anterior del archivo. Si desea hacer esto depende del nivel de de robustez que se desee.

Intente hacer cumplir que todas las manipulaciones pasan por su aplicación (crear, escribir, eliminar archivos). Si no puede hacer esto y no puede evitar el acceso directo a un archivo en el sistema de archivos (y tal vez eliminarlo), no veo otra manera que sincronizar periódicamente la base de datos con el sistema de archivos: verifique qué archivo se eliminó y elimine la entrada en la base de datos. Puede crear un trabajo que ejecute cada X minuto para eso.

También sugiero almacenar un hash (por ejemplo, MD5) del archivo en la base de datos. Tómense un poco de tiempo para calcularlo, pero eso ha sido inmensamente útil para detectar problemas, p. si el archivo se renombra en el sistema de archivos por error, pero no en la base de datos. Eso también permite ejecutar algunas revisiones de integridad periódicamente, para verificar que no haya nada atornillado.

Si este enfoque no es suficiente (por ejemplo, desea que sea más robusto), no veo otra manera que almacenar el binario en la base de datos en LOB. Entonces será realmente transaccional y seguro.

1

Una vieja pregunta lo sé, pero en beneficio de otros lectores:

Dependiendo de sus sistemas operativos es posible que pueda utilizar transaccional TxF

http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

+0

Tenga en cuenta que Microsoft ahora planea desaprobar TxF en algún momento en el futuro. Recomiendan el uso de [enfoques alternativos] (http://msdn.microsoft.com/en-us/hh802690) como [SQL FILESTREAM] (http://technet.microsoft.com/en-us/library/bb933993.aspx) s. – mwolfe02

Cuestiones relacionadas