Comment “transiger” une opération IO et une exécution de firebase database?

J’ai un service qui contient un processeur en cours d’exécution, et il fait deux choses:

1- Create a file in a directory. 2- Set your own status to "Processed". 

Mais, lorsque le service est arrêté exactement au milieu du traitement, le fichier est créé dans le répertoire, mais le processus n’est pas finalisé, comme ceci:

  1- Create a file in a directory. -----SERVICE STOPPED----- 2- Set your own status to "Processed". 

J’ai besoin d’un moyen de traiter les opérations IO avec les commandes de firebase database, comment faire cela?

EDIT – IMPORTANT

Le problème est que le fichier créé est capturé par une autre application. Le fichier ne doit donc être créé que si les commandes sont exécutées avec succès. Parce que si le fichier est créé et capturé par une autre application, et après une erreur de firebase database, le problème se poursuit.

OBS: J’utilise c # pour développer.

Vous pouvez utiliser NTFS transactionnel (TxF). Cela permet d’effectuer des actions entièrement atomiques, cohérentes, isolées et durables pour les opérations de fichier.

Il peut être intégré pour fonctionner avec un grand nombre d’autres technologies transactionnelles. Parce que TxF utilise les nouvelles fonctionnalités du gestionnaire de transactions de kernel (KTM) et que le nouveau KTM peut fonctionner directement avec le coordinateur de transactions dissortingbuées (DTC) Microsoft®.

Toute technologie pouvant fonctionner avec DTC en tant que coordinateur de transaction peut utiliser des opérations de fichier traité dans une seule transaction. Cela signifie que vous pouvez désormais inscrire les opérations de fichier traité dans la même transaction que les opérations SQL, les appels de service Web via WS-AtomicTransaction, les services Windows Communication Foundation via OleTransactionProtocol ou même les opérations MSMQ transactées.

Un exemple de transaction atomique de fichier et de firebase database:

 using (connectionDb) { connectionDb.Open(); using (var ts = new System.Transactions.TransactionScope()) { try { File.Copy(sourceFileName, destFileName, overwrite); connectionDb.ExecuteNonQuery(); ts.Complete(); } catch (Exception) { throw; } finally { } } } 

Voir les liens suivants pour plus d’informations:

TxF sur Codeplex

Référence msdn

Remarque: N’oubliez pas que le DTC entraîne une lourde pénalité de performance

Vous n’avez pas spécifié le serveur de firebase database, mais Microsoft SQL Server 2008 R2 prend en charge la transmission en continu des données de fichier dans le cadre d’une transaction.

Voir: https://technet.microsoft.com/en-us/library/bb933993%28v=sql.105%29.aspx

 Transactional Durability With FILESTREAM, upon transaction commit, the Database Engine ensures transaction durability for FILESTREAM BLOB data that is modified from the file system streaming access. 

Je ne le recommanderais pas pour les très gros fichiers, car vous voulez souvent que la transaction soit aussi rapide que possible lorsque vous avez beaucoup de transactions simultanées.

J’utiliserais normalement un comportement de compensation, par exemple, le statut de stockage dans une firebase database et, lors du redémarrage d’un service, demandez-lui de vérifier en premier lieu les opérations en cours mais non terminées, puis de les terminer.

  1. Opération démarrée sur le serveur x à la date et l’heure y
  2. Opération terminée sur le serveur x à la date et l’heure y