Mode de transaction pour les opérations de fichiers en Java

Peut-être que ce que j’essaie d’expliquer ici n’a aucun sens, alors je voudrais m’excuser d’avance. En tout cas, je vais essayer.

J’essaie de lire un fichier, d’effectuer des opérations de firebase database et de déplacer le contenu vers un autre fichier. Je me demandais s’il était possible d’effectuer toutes ces opérations de manière atomique en Java, donc si quelque chose se passe mal dans la liste des actions, annulez la séquence complète et revenez au sharepoint départ.

Merci d’avance pour votre aide.

Jetez un oeil à Apache Commons Transaction . Il a la capacité de gérer les fichiers de manière transactionnelle.

Un article archivé décrivait son utilisation avec le système de fichiers.

Il n’y a pas d’API Transaction File standard, mais je pense qu’il existe un projet Apache qui implémente ce que vous voulez.

http://commons.apache.org/transaction/file/index.html

Le package de fichiers transactionnel vous fournit un code qui vous permet d’effectuer des opérations de lecture et d’écriture atomique sur n’importe quel système de fichiers. Le gestionnaire de ressources de fichiers vous offre la possibilité d’isoler un certain nombre d’opérations sur un ensemble de fichiers dans une transaction. En utilisant le paquet locks, il est capable de vous offrir des transactions ACID complètes, y compris la sérialisation. Bien sûr, pour que cela fonctionne, tous les access aux fichiers gérés doivent être effectués par ce gestionnaire. L’access direct au système de fichiers ne peut pas être surveillé par le gestionnaire.

Comme XADisk prend en charge les transactions XA sur les systèmes de fichiers, cela devrait vous résoudre le problème. Il peut participer à des transactions XA avec des bases de données et d’autres ressources XA.

Si votre application ne se trouve pas dans un environnement compatible JCA, vous pouvez également utiliser le gestionnaire de transactions autonome comme Atomikos et effectuer des transactions XA impliquant à la fois des fichiers (à l’aide de XADisk) et de la firebase database.

Non, du moins pas avec un simple appel. Les systèmes de fichiers en général (et les opérations du système de fichiers Java en particulier) ne prennent pas en charge une “restauration”.

Vous pouvez cependant émuler ceci. Une méthode courante consisterait à renommer le fichier pour qu’il soit marqué comme étant “en cours de traitement”. Ajoutez un suffixe par exemple.

Ensuite, traitez-le, puis modifiez le fichier. Si quelque chose ne va pas, il suffit de restaurer la firebase database, de renommer tous les fichiers avec des suffixes pour leur donner leur nom d’origine et vous êtes définis.

En bonus, sur certains FS, un renommage est même atomique, vous êtes donc en sécurité même avec des mises à jour simultanées (ne sais pas si cela vous concerne). Je ne sais pas si le renommage de fichier est atomique en Java cependant; vous devriez vérifier.

Vous pouvez coordonner une transaction dissortingbuée à l’aide de la validation en deux phases . Cependant, cela est assez complexe à mettre en œuvre et une approche que j’ai souvent vue consiste à utiliser la validation en une seule phase, à créer une stack de transactions et à les engager rapidement, générant une erreur si l’une des tentatives de validation échoue. d’autres réussissent.

Si vous avez choisi de mettre en œuvre la validation en deux phases, vous devez journaliser en amont pour chaque participant à la transaction, où vous enregistrez les actions avant de les prendre, ce qui vous permet d’annuler les modifications en cas d’échec. Par exemple, vous devez le faire pour inverser les modifications apscopes aux fichiers (comme le mentionne Sleske).

JBossTS propose sa propre implémentation pour le fichier transactionnel i / o , dans le cadre du projet Narayana (anciennement appelé JBossTS).