SQL transactions, rollback και isolation — DedSec Project
SQL transactions, rollback και isolation Τι συμβαίνει Μια transaction ομαδοποιεί αλλαγές ώστε να γίνουν όλες ή καμία. Χρησιμοποίησε parameterized queries και commit μόνο αφού ελέγξεις όλες…
Τι συμβαίνει
Μια transaction ομαδοποιεί αλλαγές ώστε να γίνουν όλες ή καμία. Χρησιμοποίησε parameterized queries και commit μόνο αφού ελέγξεις όλες τις σχετικές πράξεις.
Πρακτικός έλεγχος
Διάλεξε isolation προσεκτικά: ταυτόχρονες εγγραφές μπορεί να χάσουν ενημερώσεις ή να συγκρουστούν. Δείξε το σενάριο με δύο δοκιμαστικές συνδέσεις.
Συνήθεις παγίδες
Κράτησε schema migrations αναστρέψιμες και δοκίμασέ τες σε προσωρινή βάση με αντιπροσωπευτικά δοκιμαστικά δεδομένα.
Μικρό παράδειγμα για προσαρμογή
BEGIN;
UPDATE accounts SET active = 0 WHERE id = 42;
ROLLBACK;
Μοντέλο μεταφοράς με δύο invariants
Σε προσωρινή βάση βάλε υπόλοιπα 5 και 7. Μεταφορά 2 πρέπει να αφήσει 3 και 9 και άθροισμα 12. Πρόσθεσε failure μετά τη χρέωση αλλά πριν την πίστωση, κάνε rollback και έλεγξε αρχικό ζεύγος 5 και 7. Μόνο το άθροισμα δεν εντοπίζει λάθος φορά μεταφοράς: χρειάζονται assertions για κάθε εγγραφή.
Χρησιμοποίησε χωριστή προσωρινή βάση ανά test. Το SQLite :memory: είναι συνήθως ιδιωτικό στη σύνδεση· δύο κανονικές συνδέσεις με αυτό το όνομα δεν αποτελούν αυτομάτως shared concurrency experiment. Για lock test δύο συνδέσεων χρησιμοποίησε κοινό temporary file και συντόνισε ποια κρατά write lock.
Isolation και application retries αλληλεπιδρούν. Μετά από αποτυχία καθάρισε transactional state με rollback πριν επαναλάβεις και αποφάσισε αν η πράξη επιτρέπεται να επαναληφθεί. Η συναλλαγή καλύπτει το database boundary, όχι email ή HTTP request που στάλθηκε ανάμεσα στις SQL πράξεις.