43 votes

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

Peut-être que ce que j'essaie d'expliquer ici n'a aucun sens, alors j'aimerais m'excuser par avance. Quoi qu'il en soit, je vais essayer.

J'essaie de lire à partir d'un fichier, d'effectuer certaines opérations sur la base de données et de déplacer le contenu dans un autre fichier. Je me demandais s'il était possible d'effectuer toutes ces opérations de manière atomique en Java. Si quelque chose ne va pas dans la liste des actions, annulez la séquence complète et revenez au point de départ.

Merci d'avance pour votre aide.

30voto

Brian Agnew Points 143181

Jetez un coup d'œil à Apache Commons Transaction . Il a la capacité de gérer les fichiers de manière transactionnelle.

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

8voto

pjp Points 7012

Il n'y a pas de standard de Fichier de Transaction API cependant, je crois qu'il y a un Apache projet qui met en œuvre ce que vous voulez.

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

Le transactionnel fichier de package vous offre un code qui vous permet d'avoir atomique opérations de lecture et écriture sur n'importe quel système de fichiers. Le fichier de ressource manager vous offre la possibilité d'isoler un certain nombre d'opérations sur un ensemble de fichiers dans une transaction. En utilisant les serrures de package, il est en mesure de vous offrir plein d'ACIDE transactions, y compris les serializability. Bien sûr, pour faire ce travail tous les accès à la gestion de fichiers doit être fait par ce gestionnaire. Accès Direct au système de fichiers ne peuvent pas être surveillés par le gestionnaire.

6voto

nitin Points 81

Étant donné que XADisk prend en charge les transactions XA sur des systèmes de fichiers, cela devrait résoudre votre problème. Il peut participer aux transactions XA avec les bases de données et autres ressources XA.

Si votre application ne se trouve pas dans un environnement compatible JCA, vous pouvez également utiliser le gestionnaire de transactions autonome tel qu'Atomikos et effectuer des transactions XA impliquant à la fois des fichiers (à l'aide de XADisk) et une base de données.

4voto

sleske Points 29978

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

Vous pouvez, toutefois, d'émuler ce. Une façon courante serait de commencer par renommer le fichier, de sorte qu'il est marqué comme "en cours de traitement". L'ajout de certains suffixe, par exemple.

Puis le traiter, puis de modifier le fichier. Si quelque chose va mal, il suffit de restauration de la DB, tous les renommer le fichier(s) avec les suffixes de leur nom d'origine, et vous êtes fixés.

En bonus, sur certains FS un changement de nom est encore atomique, donc, si vous voulez être en sécurité, même avec les mises à jour simultanées (ne sais pas si cela est pertinent pour vous). Je ne sais pas si renommage de fichiers est atomique en Java si vous avez besoin de vérifier.

4voto

Adamski Points 29884

Vous pouvez coordonner une transaction distribuée à l'aide de validation à Deux phases. Cependant, c'est assez complexe à mettre en œuvre et d'une approche que j'ai vu souvent adoptée consiste à utiliser une seule phase de validation, la construction d'une pile de transactions et puis commettre tous en succession rapide, générant une erreur si l'un des commettent des tentatives échoue, mais les autres à réussir.

Si vous avez choisi de mettre en œuvre de validation à Deux phases vous auriez besoin Write-Ahead Logging pour chaque participant à la transaction, où vous vous connectez actions avant que vous avez pris, vous permettant de faire reculer les modifications si la transaction échoue. Par exemple, vous auriez besoin de le faire afin de potentiellement annuler toutes les modifications apportées à des fichiers (comme sleske mentions).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X