Làm cách nào để thêm giao dịch trong MongoDB?

Các bạn đọc like ủng hộ MUO nhé. Khi bạn mua hàng bằng các liên kết trên trang web của chúng tôi, chúng tôi có thể kiếm được hoa hồng liên kết. Đọc thêm

Xây dựng ứng dụng web sẵn sàng sản xuất yêu cầu bạn đảm bảo rằng ứng dụng đó 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 cơ sở dữ liệu hoặc hoạt động tất cả thực hiện cùng nhau như một đơn vị để hoàn thành một tác vụ

Các giao dịch cơ sở dữ liệu tuân thủ các khái niệm về đặc điểm 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 thao tác đề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 dưới dạng các đơn vị nhỏ của 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 nhất quán trước và sau mỗi giao dịch
  • 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 lỗi hệ thống hoặc lỗi. Nó đảm bảo rằng một giao dịch đã cam kết không bị mất trong trường hợp lỗi hệ thống. Đ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 triển khai giao dịch cơ sở dữ liệu MongoDB trong nút. js Sử dụ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ệ

Để triển khai 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 liệt kê công việc nơi người dùng có thể đăng, cập nhật hoặc xóa một công việc. Đây là một thiết kế lược đồ cơ sở dữ liệu đơn giản cho ứng dụng này

Schema diagram for User and Job collections

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

Giao dịch không được hỗ trợ trên bản cài đặt MongoDB độc lập. Bạn sẽ cần sử dụng bộ bản sao MongoDB hoặc cụm phân mảnh MongoDB để giao dịch hoạt động. Do đó, cách dễ nhất để sử dụng các giao dịch là tạo một phiên bản MongoDB được lưu trữ trên đám mây (MongoDB Atlas). Theo mặc định, mọi phiên bản cơ sở dữ liệu Atlas là một bộ bản sao hoặc cụm phân đoạn

Đã thiết lập một Nút hoạt động. js và MongoDB, bạn có thể thiết lập kết nối tới cơ sở dữ liệu Mongo trong Node. js. Nếu bạn chưa cài đặt trước đây, hãy cài đặt cầy mangut bằng cách chạy npm install cầy mangut 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); // close the app if database connection fails
  }
};

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 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ư thế này

 
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 minh họa 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 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;

  // get the user from the DB
  const user = await userCollection.findOne({ email: userEmail });

  // start transaction session
  const session = await connection.startSession();

  // run all database queries in a try-catch block
  try {
    await session.startTransaction();

    // create job
    const newJob = await jobCollection.create(
      [
        {
          title,
          location,
          salary,
          poster: user._id,
        },
      ],
      { session }
    );

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

    // add job to users list of posted jobs
    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 truy vấn tạo 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 newJob và lưu trữ thuộc tính _id của nó trong biến newJobId

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

 const mockUser = {
  name: "Timmy Omolana",
  email: "[email protected]",
};

const mockJob = {
  title: "Sales Manager",
  location: "Lagos, Nigeria",
  salary: "$40,000",
  userEmail: "[email protected]", // email of the created user
};

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 npm start hoặc lệnh node, nó sẽ tạo ra kết quả như thế này

database transactions output

Một cách khác để triển khai các giao dịch ACID trong MongoDB bằng Mongoose là sử dụng hàm withTransaction(). 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 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;

  // get the user from the DB
  const user = await userCollection.findOne({ email: userEmail });

  // start transaction session
  const session = await connection.startSession();

  // run all database queries in a try-catch block
  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]);

      // add job to users list of posted jobs
      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 cùng một đầu ra như lần thực hiện trước. Bạn có thể tự do chọn kiểu để sử dụng khi triển khai các giao dịch cơ sở dữ liệu trong MongoDB

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

Triển khai giao dịch cơ sở dữ liệu ACID trong MongoDB

Giao dịch cơ sở dữ liệu dễ sử dụng khi được thực hiện chính xác. Bây giờ bạn đã hiểu cách 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 Node. ứng dụng 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 cân nhắc xây dựng ví fintech hoặc ứng dụng viết blog

Làm cách nào để triển khai các giao dịch trong MongoDB?

Các giao dịch trong MongoDB tuân thủ các nguyên tắc ACID này và có thể được sử dụng một cách đáng tin cậy trong các trường hợp cần thay đổi nhiều tài liệu trong một lần. .
Bước 1 — Chuyển đổi phiên bản MongoDB độc lập của bạn thành một bộ bản sao. .
Bước 2 — Chuẩn bị dữ liệu mẫu. .
Bước 3 — Tạo giao dịch hoàn chỉnh đầu tiên của bạn

Các giao dịch có thể thực hiện được trong MongoDB không?

Đối với các tình huống yêu cầu tính nguyên tử của việc đọc và ghi vào nhiều tài liệu (trong một hoặc nhiều bộ sưu tập), MongoDB hỗ trợ giao dịch nhiều tài liệu . Với các giao dịch phân tán, các giao dịch có thể được sử dụng trên nhiều hoạt động, bộ sưu tập, cơ sở dữ liệu, tài liệu và phân đoạn.

Làm cách nào để sử dụng các giao dịch MongoDB trong nút JS?

Bạn có thể dễ dàng thiết lập Giao dịch MongoDB cần thiết trên Nodejs bằng các bước sau. .
Bước 1. Thiết lập Môi trường cho Giao dịch MongoDB trên Nodejs
Bước 2. Tạo giao dịch MongoDB trên Nodejs
Bước 3. Kiểm tra chức năng được liên kết với các giao dịch MongoDB trên Nodejs

MongoDB xử lý các giao dịch hoặc khóa như thế nào?

MongoDB sử dụng khóa đa chi tiết [1] cho phép khóa các hoạt động ở cấp toàn cầu, cơ sở dữ liệu hoặc bộ sưu tập và cho phép cá nhân . g. , ở cấp độ tài liệu trong WiredTiger).