Αναγνώστες σαν εσάς βοηθούν στην υποστήριξη του MUO. Όταν κάνετε μια αγορά χρησιμοποιώντας συνδέσμους στον ιστότοπό μας, ενδέχεται να κερδίσουμε μια προμήθεια θυγατρικών.
Η δημιουργία μιας εφαρμογής web έτοιμη για παραγωγή απαιτεί να διασφαλίσετε ότι είναι ασφαλής και επεκτάσιμη.
Ένα από τα πιο σημαντικά πράγματα που πρέπει να γνωρίζετε για τις βάσεις δεδομένων είναι η αρχή ACID που σημαίνει ατομικότητα, συνέπεια, απομόνωση και ανθεκτικότητα. Σχεσιακές βάσεις δεδομένων όπως η MySQL υποστηρίζουν εγγενώς τις συναλλαγές ACID. Αλλά το MongoDB είναι μια βάση δεδομένων NoSQL και δεν υποστηρίζει συναλλαγές ACID από προεπιλογή.
Ως προγραμματιστής, θα πρέπει να γνωρίζετε πώς να εισάγετε ιδιότητες ACID στις βάσεις δεδομένων MongoDB σας.
Τι είναι οι συναλλαγές βάσης δεδομένων;
Μια συναλλαγή βάσης δεδομένων είναι μια ακολουθία ερωτημάτων ή λειτουργιών βάσης δεδομένων που εκτελούνται όλες μαζί ως μια μονάδα για να ολοκληρώσουν μια εργασία.
Οι συναλλαγές βάσης δεδομένων συμμορφώνονται με τις έννοιες των χαρακτηριστικών ACID. Αυτό βοηθά να διασφαλιστεί ότι δεν θα πραγματοποιηθούν αλλαγές εκτός εάν όλες οι λειτουργίες είναι επιτυχείς. Εξασφαλίζει επίσης ότι η βάση δεδομένων είναι συνεπής.
Επεξήγηση των ιδιοτήτων ACID
Οι τέσσερις ιδιότητες που συνθέτουν τις αρχές του ACID είναι:
- Ατομικότητα είναι η ιδιότητα που αντιλαμβάνεται τις συναλλαγές ως μικρές μονάδες ενός προγράμματος. Αυτό σημαίνει ότι όλα τα ερωτήματα είτε εκτελούνται με επιτυχία είτε αποτυγχάνουν μαζί.
- Συνοχή δηλώνει ότι οι εγγραφές της βάσης δεδομένων πρέπει να παραμένουν συνεπείς πριν και μετά από κάθε συναλλαγή.
- Απομόνωση διασφαλίζει ότι, όταν εκτελούνται πολλές συναλλαγές ταυτόχρονα, η μία δεν επηρεάζει την άλλη.
- Αντοχή επικεντρώνεται σε βλάβες ή σφάλματα συστήματος. Διασφαλίζει ότι μια δεσμευμένη συναλλαγή δεν θα χαθεί σε περίπτωση βλάβης του συστήματος. Αυτό μπορεί να περιλαμβάνει τεχνικές απαραίτητες για την αυτόματη επαναφορά δεδομένων από ένα αντίγραφο ασφαλείας μόλις εμφανιστεί ξανά το σύστημα.
Πώς να εφαρμόσετε συναλλαγές βάσης δεδομένων MongoDB στο Node.js χρησιμοποιώντας το Mongoose
Το MongoDB έχει γίνει μια ευρέως χρησιμοποιούμενη τεχνολογία βάσης δεδομένων με τα χρόνια λόγω NoSQL φύση του και ευέλικτο μοντέλο που βασίζεται σε έγγραφα. Σας προσφέρει επίσης τη δυνατότητα να οργανώνετε καλύτερα τα δεδομένα σας και πιο ευέλικτα από ό, τι σε SQL ή σχεσιακές βάσεις δεδομένων.
Για να εφαρμόσετε συναλλαγές βάσης δεδομένων στο MongoDB, μπορείτε να εξετάσετε ένα δείγμα σεναρίου σε μια εφαρμογή καταχώρισης εργασιών όπου ένας χρήστης μπορεί να δημοσιεύσει, να ενημερώσει ή να διαγράψει μια εργασία. Ακολουθεί ένας απλός σχεδιασμός σχήματος βάσης δεδομένων για αυτήν την εφαρμογή:
Για να ακολουθήσετε, αυτή η ενότητα απαιτεί βασικές γνώσεις προγραμματισμού Node.js και MongoDB.
Οι συναλλαγές δεν υποστηρίζονται σε αυτόνομες εγκαταστάσεις MongoDB. Θα χρειαστεί να χρησιμοποιήσετε ένα Σετ ρεπλίκα MongoDB ή Θρυμματισμένο σύμπλεγμα MongoDB για να λειτουργήσουν οι συναλλαγές. Επομένως, ο ευκολότερος τρόπος χρήσης των συναλλαγών είναι να δημιουργήστε μια παρουσία MongoDB που φιλοξενείται στο σύννεφο (MongoDB Atlas). Από προεπιλογή, κάθε στιγμιότυπο βάσης δεδομένων Atlas είναι ένα σύνολο αντιγράφων ή ένα σύμπλεγμα κομματιού.
Έχοντας ρυθμίσει ένα λειτουργικό έργο Node.js και MongoDB, μπορείτε να ρυθμίσετε μια σύνδεση με μια βάση δεδομένων Mongo στο Node.js. Εάν δεν το έχετε κάνει μέχρι τώρα, εγκαταστήστε το mongoose τρέχοντας npm εγκατάσταση mongoose στο τερματικό σας.
εισαγωγή μαγκούστα από 'μαγκούστα'
ας MONGO_URL = process.env. MONGO_URL || 'your-mongo-database-url';
αφήνω σύνδεση;
συνθ connectDb = ασυγχρονισμός () => {
δοκιμάστε {
αναμένω mongoose.connect (MONGO_URL, {
useNewUrlParser: αληθής,
useUnifiedTopology: αληθής,
});
console.log("ΣΥΝΔΕΔΕΤΑΙ ΜΕ ΒΑΣΗ ΔΕΔΟΜΕΝΩΝ");
σύνδεση = μαγκούστα.σύνδεση;
} σύλληψη (λάθος) {
console.error("Η ΣΥΝΔΕΣΗ ΒΑΣΗΣ ΔΕΔΟΜΕΝΩΝ ΑΠΟΤΥΧΕ!");
κονσόλα.λάθος(πλανώμαι.μήνυμα);
επεξεργάζομαι, διαδικασία.έξοδος(1); // κλείστε την εφαρμογή εάν αποτύχει η σύνδεση της βάσης δεδομένων
}
};
Θα πρέπει να αποθηκεύσετε τη σύνδεση σε μια μεταβλητή, ώστε να μπορείτε να τη χρησιμοποιήσετε για να ξεκινήσετε μια συναλλαγή αργότερα στο πρόγραμμα.
Μπορείτε να εφαρμόσετε τις συλλογές χρηστών και εργασιών ως εξής:
συνθ userSchema = νέος μαγκούστα. Σχήμα({
όνομα: Σειρά,
ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: Σειρά,
θέσεις εργασίας: [μαγκούστα. Σχήμα. Τύποι. Αναγνωριστικό αντικειμένου]
});συνθ jobSchema = νέος μαγκούστα. Σχήμα({
τίτλος: Σειρά,
τοποθεσία: Σειρά,
Μισθός: Σειρά,
αφίσα: μαγκούστα.Σχήμα.Τύποι.Αναγνωριστικό αντικειμένου
});
const userCollection = mongoose.model('χρήστης', userSchema);
const jobCollection = mongoose.model('δουλειά', jobSchema);
Μπορείτε να γράψετε μια συνάρτηση για να προσθέσετε έναν χρήστη στη βάση δεδομένων ως εξής:
συνθ createUser = ασυγχρονισμός (χρήστης) => {
συνθ νέος χρήστης = αναμένω userCollection.create (χρήστης);
κονσόλα.log("Ο χρήστης προστέθηκε στη βάση δεδομένων");
κονσόλα.log (νέος χρήστης);
}
Ο παρακάτω κώδικας δείχνει τη λειτουργία δημιουργίας μιας εργασίας και προσθήκης στη λίστα εργασιών της αφίσας χρησιμοποιώντας μια συναλλαγή βάσης δεδομένων.
συνθ δημιουργίαΕργασίας = ασυγχρονισμός (δουλειά) => {
συνθ { email χρήστη, τίτλος, τοποθεσία, μισθός } = δουλειά;// λήψη του χρήστη από το DB
συνθ χρήστης = αναμένω userCollection.findOne({ ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: userEmail });// έναρξη συνεδρίας συναλλαγής
συνθ συνεδρία = αναμένω connection.startSession();// εκτελέστε όλα τα ερωτήματα της βάσης δεδομένων σε ένα μπλοκ try-catch
δοκιμάστε {
αναμένω session.startTransaction();// δημιουργία εργασίας
συνθ νέα δουλειά = αναμένω jobCollection.create(
[
{
τίτλος,
τοποθεσία,
Μισθός,
αφίσα: user._id,
},
],
{ συνεδρία }
);
κονσόλα.log("Δημιουργήθηκε νέος δουλειά με επιτυχία!");
κονσόλα.log (newJob[0]);// προσθήκη εργασίας στη λίστα των δημοσιευμένων εργασιών χρηστών
συνθ newJobId = νέα δουλειά[0]._ταυτότητα;
συνθ AddToUser = αναμένω userCollection.findByIdAndUpdate(
ταυτότητα χρήστη,
{ $addToSet: { θέσεις εργασίας: newJobId } },
{ συνεδρία }
);κονσόλα.log("Η εργασία προστέθηκε με επιτυχία στη λίστα εργασιών χρήστη");
κονσόλα.log (addedToUser);αναμένω session.commitTransaction();
κονσόλα.log("Η συναλλαγή DB ολοκληρώθηκε με επιτυχία");
} σύλληψη (ε) {
κονσόλα.σφάλμα (ε);
κονσόλα.log("Αποτυχία ολοκλήρωσης των λειτουργιών της βάσης δεδομένων");
αναμένω session.aborTransaction();
} τελικά {
αναμένω session.endSession();
κονσόλα.log("Τέλος συνεδρία συναλλαγής");
}
};
ΕΝΑ δημιουργώ το ερώτημα που εκτελείται σε μια συναλλαγή συνήθως δέχεται και επιστρέφει έναν πίνακα. Μπορείτε να το δείτε στον παραπάνω κώδικα όπου δημιουργείται νέα δουλειά και το αποθηκεύει _ταυτότητα ιδιοκτησία στοnewJobId μεταβλητός.
Ακολουθεί μια επίδειξη του τρόπου λειτουργίας των παραπάνω λειτουργιών:
συνθ mockUser = {
όνομα: "Timmy Omolana",
email: "[email protected]",
};συνθ mockJob = {
τίτλος: "Διευθυντής πωλήσεων",
τοποθεσία: "Λάγος, Νιγηρία",
μισθός: «$40,000",
Διεύθυνση ηλεκτρονικού ταχυδρομείου χρήστη: "[email protected]", // email του χρήστη που δημιουργήθηκε
};συνθ startServer = ασυγχρονισμός () => {
αναμένω connectDb();
αναμένω createUser (mockUser);
αναμένω createJob (mockJob);
};
startServer()
.έπειτα()
.catch((err) => κονσόλα.log (err));
Εάν αποθηκεύσετε αυτόν τον κωδικό και τον εκτελέσετε χρησιμοποιώντας npm έναρξη ή το κόμβος εντολή, θα πρέπει να παράγει μια έξοδο όπως αυτή:
Ένας άλλος τρόπος υλοποίησης συναλλαγών ACID στο MongoDB χρησιμοποιώντας το Mongoose είναι χρησιμοποιώντας το withTransaction() λειτουργία. Αυτή η προσέγγιση παρέχει μικρή ευελιξία καθώς εκτελεί όλα τα ερωτήματα μέσα σε μια συνάρτηση επανάκλησης που μεταβιβάζετε ως όρισμα στη συνάρτηση.
Θα μπορούσατε να αναδιαμορφώσετε την παραπάνω συναλλαγή βάσης δεδομένων για χρήση withTransaction() σαν αυτό:
συνθ δημιουργίαΕργασίας = ασυγχρονισμός (δουλειά) => {
συνθ { email χρήστη, τίτλος, τοποθεσία, μισθός } = δουλειά;// λήψη του χρήστη από το DB
συνθ χρήστης = αναμένω userCollection.findOne({ ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ: userEmail });// έναρξη συνεδρίας συναλλαγής
συνθ συνεδρία = αναμένω connection.startSession();// εκτελέστε όλα τα ερωτήματα της βάσης δεδομένων σε ένα μπλοκ try-catch
δοκιμάστε {
συνθ συναλλαγή Επιτυχία = αναμένω session.withTransaction(ασυγχρονισμός () => {
συνθ νέα δουλειά = αναμένω jobCollection.create(
[
{
τίτλος,
τοποθεσία,
Μισθός,
αφίσα: user._id,
},
],
{ συνεδρία }
);κονσόλα.log("Δημιουργήθηκε νέος δουλειά με επιτυχία!");
κονσόλα.log (newJob[0]);// προσθήκη εργασίας στη λίστα των δημοσιευμένων εργασιών χρηστών
συνθ newJobId = νέα δουλειά[0]._ταυτότητα;
συνθ AddToUser = αναμένω userCollection.findByIdAndUpdate(
ταυτότητα χρήστη,
{ $addToSet: { θέσεις εργασίας: newJobId } },
{ συνεδρία }
);κονσόλα.log("Η εργασία προστέθηκε με επιτυχία στη λίστα εργασιών χρήστη");
κονσόλα.log (addedToUser);
});
αν (επιτυχία συναλλαγής) {
κονσόλα.log("Η συναλλαγή DB ολοκληρώθηκε με επιτυχία");
} αλλού {
κονσόλα.log("Η συναλλαγή απέτυχε");
}
} σύλληψη (ε) {
κονσόλα.σφάλμα (ε);
κονσόλα.log("Αποτυχία ολοκλήρωσης των λειτουργιών της βάσης δεδομένων");
} τελικά {
αναμένω session.endSession();
κονσόλα.log("Τέλος συνεδρία συναλλαγής");
}
};
Αυτό θα παράγει το ίδιο αποτέλεσμα με την προηγούμενη εφαρμογή. Είστε ελεύθεροι να επιλέξετε ποιο στυλ θα χρησιμοποιήσετε κατά την υλοποίηση συναλλαγών βάσης δεδομένων στο MongoDB.
Αυτή η υλοποίηση δεν χρησιμοποιεί το commitTransaction() και abortTransaction() λειτουργίες. Αυτό συμβαίνει επειδή το withTransaction() η λειτουργία δεσμεύει αυτόματα τις επιτυχημένες συναλλαγές και ματαιώνει τις αποτυχημένες. Η μόνη λειτουργία που πρέπει να καλέσετε σε όλες τις περιπτώσεις είναι η session.endSession() λειτουργία.
Υλοποίηση συναλλαγών βάσης δεδομένων ACID στο MongoDB
Οι συναλλαγές βάσης δεδομένων είναι εύχρηστες όταν γίνονται σωστά. Θα πρέπει τώρα να κατανοήσετε πώς λειτουργούν οι συναλλαγές της βάσης δεδομένων στο MongoDB και πώς μπορείτε να τις εφαρμόσετε σε εφαρμογές Node.js.
Για να εξερευνήσετε περαιτέρω την ιδέα των συναλλαγών ACID και τον τρόπο λειτουργίας τους στο MongoDB, σκεφτείτε να δημιουργήσετε ένα πορτοφόλι fintech ή μια εφαρμογή blogging.