/ / Cách sử dụng giao dịch cơ sở dữ liệu với MongoDB và Node.js

Cách sử dụng giao dịch cơ sở dữ liệu với MongoDB và Node.js

Việc xây dựng một ứng dụng web sẵn sàng sản xuất đòi hỏi bạn phải đảm bảo rằng nó an toàn và có thể mở rộng.


Một trong những điều quan trọng nhất cần biết về cơ sở dữ liệu là nguyên tắc ACID, viết tắt của tính nguyên tử, tính nhất quán, sự cô lập và độ bền. Cơ sở dữ liệu quan hệ như MySQL hỗ trợ các giao dịch ACID nguyên bản. Nhưng MongoDB là một cơ sở dữ liệu NoSQL và không hỗ trợ các giao dịch ACID theo mặc định.

Là một lập trình viên, bạn nên biết cách đưa các thuộc tính ACID vào cơ sở dữ liệu MongoDB của mình.


Giao dịch cơ sở dữ liệu là gì?

Giao dịch cơ sở dữ liệu là một chuỗi các truy vấn hoặc hoạt động cơ sở dữ liệu mà tất cả đều thực hiện cùng nhau như một đơn vị để hoàn thành một nhiệm vụ.

Các giao dịch cơ sở dữ liệu tuân theo các khái niệm về đặc tính ACID. Điều này giúp đảm bảo rằng không có thay đổi nào xảy ra trừ khi tất cả các hoạt động đều thành công. Nó cũng đảm bảo cơ sở dữ liệu nhất quán.

Các thuộc tính ACID được giải thích

Bốn thuộc tính tạo nên các nguyên tắc ACID là:

  • Tính nguyên tử là thuộc tính khái niệm hóa các giao dịch như các đơn vị nhỏ của một chương trình. Điều này ngụ ý rằng tất cả các truy vấn chạy thành công hoặc thất bại cùng nhau.
  • Tính nhất quán nói rằng các bản ghi cơ sở dữ liệu phải duy trì nhất quán trước và sau mỗi giao dịch.
  • Sự cách ly đảm bảo rằng, khi nhiều giao dịch chạy đồng thời, giao dịch này không ảnh hưởng đến giao dịch kia.
  • Độ bền tập trung vào các lỗi hoặc lỗi hệ thống. Nó đảm bảo rằng một giao dịch đã cam kết không bị mất trong trường hợp hệ thống bị lỗi. Điều này có thể liên quan đến các kỹ thuật cần thiết để tự động khôi phục dữ liệu từ bản sao lưu sau khi hệ thống hoạt động trở lại.

Cách thực hiện các giao dịch cơ sở dữ liệu MongoDB trong Node.js bằng Mongoose

MongoDB đã trở thành một công nghệ cơ sở dữ liệu được sử dụng rộng rãi trong những năm qua do tính chất NoSQL và mô hình dựa trên tài liệu linh hoạt của nó. Nó cũng cung cấp cho bạn khả năng tổ chức dữ liệu của bạn tốt hơn và linh hoạt hơn so với trong SQL hoặc cơ sở dữ liệu quan hệ.

Để thực hiện các giao dịch cơ sở dữ liệu trong MongoDB, bạn có thể xem xét một kịch bản mẫu trên ứng dụng danh sách công việc nơi người dùng có thể đăng, cập nhật hoặc xóa công việc. Đây là một thiết kế giản đồ cơ sở dữ liệu đơn giản cho ứng dụng này:

Sơ đồ lược đồ cho bộ sưu tập Người dùng và Công việc

Để làm theo, phần này yêu cầu kiến ​​thức cơ bản về lập trình Node.js và MongoDB.

Sau khi thiết lập dự án Node.js và MongoDB đang hoạt động, bạn có thể thiết lập kết nối với cơ sở dữ liệu Mongo trong Node.js. Nếu bạn chưa có trước đây, hãy cài đặt mongoose bằng cách chạy npm cài đặt mongoose trong thiết bị đầu cuối của bạn.

import mongoose from 'mongoose'

let MONGO_URL = process.env.MONGO_URL || 'your-mongo-database-url';

let connection;
const connectDb = async () => {
try {
await mongoose.connect(MONGO_URL, {
useNewUrlParser: true,
useUnifiedTopology: true,
});

console.log("CONNECTED TO DATABASE");
connection = mongoose.connection;
} catch (err) {
console.error("DATABASE CONNECTION FAILED!");
console.error(err.message);
process.exit(1);
}
};

Bạn nên lưu trữ kết nối trong một biến để bạn có thể sử dụng nó để bắt đầu một giao dịch sau này trong chương trình.

Bạn có thể triển khai bộ sưu tập người dùng và công việc như vậy:

const userSchema = new mongoose.Schema({
name: String,
email: String,
jobs: [mongoose.Schema.Types.ObjectId]
});

const jobSchema = new mongoose.Schema({
title: String,
location: String,
salary: String,
poster: mongoose.Schema.Types.ObjectId
});

const userCollection = mongoose.model('user', userSchema);
const jobCollection = mongoose.model('job', jobSchema);

Bạn có thể viết một hàm để thêm người dùng vào cơ sở dữ liệu như sau:


const createUser = async (user) => {
const newUser = await userCollection.create(user);
console.log("User added to database");
console.log(newUser);
}

Đoạn mã dưới đây trình bày chức năng tạo một công việc và thêm nó vào danh sách công việc của người đăng nó bằng cách sử dụng một giao dịch cơ sở dữ liệu.


const createJob = async (job) => {
const { userEmail, title, location, salary } = job;


const user = await userCollection.findOne({ email: userEmail });


const session = await connection.startSession();


try {
await session.startTransaction();


const newJob = await jobCollection.create(
[
{
title,
location,
salary,
poster: user._id,
},
],
{ session }
);
console.log("Created new job successfully!");
console.log(newJob[0]);


const newJobId = newJob[0]._id;
const addedToUser = await userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { jobs: newJobId } },
{ session }
);

console.log("Successfully added job to user's jobs list");
console.log(addedToUser);

await session.commitTransaction();

console.log("Successfully carried out DB transaction");
} catch (e) {
console.error(e);
console.log("Failed to complete database operations");
await session.abortTransaction();
} finally {
await session.endSession();
console.log("Ended transaction session");
}
};

Một tạo ra truy vấn chạy trong một giao dịch thường nhận và trả về một mảng. Bạn có thể thấy điều này trong đoạn mã ở trên, nơi nó tạo ra việc làm mới và lưu trữ nó _Tôi tài sản trong newJobId Biến đổi.

Dưới đây là minh họa về cách hoạt động của các hàm trên:

const mockUser = {
name: "Timmy Omolana",
email: "jobposter@example.com",
};

const mockJob = {
title: "Sales Manager",
location: "Lagos, Nigeria",
salary: "$40,000",
userEmail: "jobposter@example.com",
};

const startServer = async () => {
await connectDb();
await createUser(mockUser);
await createJob(mockJob);
};

startServer()
.then()
.catch((err) => console.log(err));

Nếu bạn lưu mã này và chạy nó bằng cách sử dụng npm bắt đầu hoặc là nút nó sẽ tạo ra một đầu ra như thế này:

đầu ra giao dịch cơ sở dữ liệu

Một cách khác để thực hiện các giao dịch ACID trong MongoDB bằng cách sử dụng Mongoose là bằng cách sử dụng withTransaction () hàm số. Cách tiếp cận này cung cấp ít tính linh hoạt vì nó chạy tất cả các truy vấn bên trong một hàm gọi lại mà bạn chuyển làm đối số cho hàm.

Bạn có thể cấu trúc lại giao dịch cơ sở dữ liệu ở trên để sử dụng withTransaction () như thế này:

const createJob = async (job) => {
const { userEmail, title, location, salary } = job;


const user = await userCollection.findOne({ email: userEmail });


const session = await connection.startSession();


try {
const transactionSuccess = await session.withTransaction(async () => {
const newJob = await jobCollection.create(
[
{
title,
location,
salary,
poster: user._id,
},
],
{ session }
);

console.log("Created new job successfully!");
console.log(newJob[0]);


const newJobId = newJob[0]._id;
const addedToUser = await userCollection.findByIdAndUpdate(
user._id,
{ $addToSet: { jobs: newJobId } },
{ session }
);

console.log("Successfully added job to user's jobs list");
console.log(addedToUser);
});

if (transactionSuccess) {
console.log("Successfully carried out DB transaction");
} else {
console.log("Transaction failed");
}
} catch (e) {
console.error(e);
console.log("Failed to complete database operations");
} finally {
await session.endSession();
console.log("Ended transaction session");
}
};

Điều này sẽ tạo ra kết quả tương tự như việc triển khai trước đó. Bạn có thể tự do chọn kiểu nào sẽ sử dụng khi thực hiện các giao dịch cơ sở dữ liệu trong MongoDB.

Việc triển khai này không sử dụng commitTransaction ()abortTransaction () chức năng. Điều này là bởi vì withTransaction () chức năng tự động cam kết các giao dịch thành công và hủy bỏ các giao dịch không thành công. Hàm duy nhất mà bạn nên gọi trong mọi trường hợp là session.endSession () hàm số.

Thực hiện các giao dịch cơ sở dữ liệu ACID trong MongoDB

Các giao dịch cơ sở dữ liệu rất dễ sử dụng khi được thực hiện một cách chính xác. Bây giờ bạn sẽ hiểu cách các giao dịch Cơ sở dữ liệu hoạt động trong MongoDB và cách bạn có thể triển khai chúng trong các ứng dụng Node.js.

Để khám phá thêm ý tưởng về các giao dịch ACID và cách chúng hoạt động trong MongoDB, hãy xem xét việc xây dựng ví fintech hoặc ứng dụng viết blog.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *