Έχω να λύσω ένα θέμα το οποίο λίγο-πολύ όλοι το έχουμε συναντήσει. Έχω μερικούς αλγορίθμους και κάνουν κάποιους υπολογισμούς και διάφορα τέτοια και στο μεταξύ :
α) επεμβένουν σε μια βάση δεδομένων
β) δημιουργούν/διαγράφουν και μεταφέρουν κάποια αρχεία στο δίσκο.
Για λόγους backward compatibility με συνεργαζόμενα υποσυστήματα δεν μπορώ να αποφύγω κάτι από αυτά.
Το πρόβλημα είναι, όπως εύκολα καταλαβαίνει κανείς, πως μπορούν να διασφαλιστούν τις αρχές του ACID (Atomicity, Consistency, Isolation, and Durability) σε όλη αυτή τη διαδικασία. Για τις εργασίες στη βάση δεδομένων τα πράγματα είναι σχετικά απλά. Ξεκινώντας ένα transaction και κάνοντας rollback/commit θεωρώ ότι είμαι καλυμένος, για τις ανάγκες της συγκεκριμένης περίπτωσης. Τι γίνεται όμως με τη δημιουργία/διαγραφή/μεταφορά/αντικατάσταση αρχείων στο μεταξύ.
Καταρχήν δέχομαι ότι απόλυτη λύση δεν υπάρχει. Απλά θέλω να κάνω ότι μπορώ για να εξασφαλίσω τα βασικά. Οπότε σκέφτηκα τα εξής:
- Τα αρχεία που είναι να δημιουργηθούν, δημιουργούνται προσωρινά σε άλλη θέση.
- Τα αρχεία που είναι να διαγραφούν, μπαίνουν σε ένα collection (τα ονόματά τους).
- Τα αρχεία που είναι να τροποποιηθούν, αντιγράφονται σε προσωρινή θέση και τροποποιούνται εκεί.
Στο τέλος της διαδιασίας, πριν το "Commit Transaction" στην βάση δεδομένων αντιγράφω τα αρχεία από την προσωρινή θέση στην τελική τους και σβήνω αυτά που υπάρχουν στο collection διαγραφής. Μετά από όλα αυτά εκτελώ και το "Commit Transaction" στην βάση. Για λόγους απλότητας επιβάλω διαγραφή ακόμα και αν τα αρχεία είναι readonly.
Προχωρόντας ένα βήμα πιο περα, σε περίπτωση προβλήματος, μπορώ να κάνω rollback στα αρχεία διαγράφοντας αυτά που δημιούργησα, επαναφέροντας αυτά που έσβησα ή αντικατέστησα (φυσικά θα πρέπει να έχω κρατήσει κάπου όλα αυτά).
Μπορείτε σας παρακαλώ να μου παραθέσετε τις απόψεις σας;
Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.