خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه استفاده از تراکنش های پایگاه داده با MongoDB و Node.js

با تراکنش های MongoDB اطمینان حاصل کنید که ذخیره داده های شما تا حد امکان قوی است.

ساختن یک برنامه وب آماده برای تولید به شما نیاز دارد که از ایمن و مقیاس پذیر بودن آن اطمینان حاصل کنید.

یکی از مهم ترین چیزهایی که باید در مورد پایگاه های داده بدانید، اصل ACID است که مخفف اتمی، سازگاری، جداسازی و دوام است. پایگاه داده های رابطه ای مانند MySQL از تراکنش های ACID به صورت بومی پشتیبانی می کنند. اما MongoDB یک پایگاه داده NoSQL است و به طور پیش فرض از تراکنش های ACID پشتیبانی نمی کند.

به عنوان یک برنامه نویس، باید بدانید که چگونه ویژگی های ACID را در پایگاه داده MongoDB خود معرفی کنید.

تراکنش های پایگاه داده چیست؟

تراکنش پایگاه داده دنباله ای از پرس و جوها یا عملیات پایگاه داده است که همه با هم به عنوان یک واحد برای تکمیل یک کار اجرا می شوند.

تراکنش های پایگاه داده به مفاهیم ویژگی های ACID پایبند هستند. این کمک می کند تا اطمینان حاصل شود که هیچ تغییری رخ نمی دهد مگر اینکه همه عملیات ها موفقیت آمیز باشند. همچنین تضمین می کند که پایگاه داده سازگار است.

ویژگی های اسید توضیح داده شده است

چهار ویژگی که اصول ACID را تشکیل می دهند عبارتند از:

  • اتمیسیتی خاصیتی است که تراکنش ها را به عنوان واحدهای کوچک یک برنامه مفهوم می کند. این بدان معناست که همه پرس و جوها یا با موفقیت اجرا می شوند یا با هم شکست می خورند.
  • Consistency بیان می کند که رکوردهای پایگاه داده باید قبل و بعد از هر تراکنش ثابت باقی بمانند.
  • جداسازی تضمین می‌کند که وقتی چندین تراکنش به طور همزمان اجرا می‌شوند، یکی بر دیگری تأثیر نمی‌گذارد.
  • دوام بر خرابی یا نقص سیستم تمرکز دارد. این تضمین می کند که یک تراکنش متعهد در صورت خرابی سیستم از بین نمی رود. این ممکن است شامل تکنیک‌های لازم برای بازیابی خودکار داده‌ها از یک نسخه پشتیبان پس از بالا آمدن مجدد سیستم باشد.

نحوه پیاده سازی تراکنش های پایگاه داده MongoDB در Node.js با استفاده از Mongoose

MongoDB به دلیل ماهیت NoSQL و مدل منعطف مبتنی بر اسناد، طی سال‌ها به یک فناوری پایگاه داده پرکاربرد تبدیل شده است. همچنین به شما این امکان را می دهد که داده های خود را بهتر و انعطاف پذیرتر از پایگاه داده های SQL یا رابطه ای سازماندهی کنید.

مطلب مرتبط:   بهترین دوره های آنلاین هک اخلاقی برای مبتدیان

برای پیاده‌سازی تراکنش‌های پایگاه داده در MongoDB، می‌توانید یک سناریوی نمونه را در یک برنامه فهرست مشاغل در نظر بگیرید که در آن کاربر می‌تواند یک کار را پست، به‌روزرسانی یا حذف کند. در اینجا یک طرح ساده پایگاه داده برای این برنامه آمده است:

نمودار طرح واره برای مجموعه های کاربر و شغل

برای ادامه، این بخش به دانش اولیه برنامه نویسی Node.js و MongoDB نیاز دارد.

تراکنش ها در نصب های مستقل MongoDB پشتیبانی نمی شوند. شما باید از a استفاده کنید
مجموعه ماکت MongoDB
یا
خوشه خرد شده MongoDB
برای انجام معاملات بنابراین، ساده ترین راه برای استفاده از تراکنش ها این است که
یک نمونه MongoDB میزبان ابری ایجاد کنید
(اطلس MongoDB). به طور پیش فرض، هر نمونه پایگاه داده Atlas یک مجموعه مشابه یا خوشه خرد شده است.

با راه‌اندازی یک پروژه Node.js و MongoDB، می‌توانید یک اتصال به پایگاه داده Mongo در Node.js راه‌اندازی کنید. اگر قبلاً این کار را نکرده اید، mongoose را با اجرای npm install mongoose در ترمینال خود نصب کنید.

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
  }
};

شما باید اتصال را در یک متغیر ذخیره کنید تا بتوانید از آن برای شروع تراکنش بعدا در برنامه استفاده کنید.

می توانید مجموعه های کاربران و مشاغل را مانند موارد زیر پیاده سازی کنید:

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);

می توانید تابعی برای افزودن یک کاربر به پایگاه داده مانند این بنویسید:


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

کد زیر عملکرد ایجاد یک شغل و افزودن آن به لیست مشاغل پوستر خود را با استفاده از تراکنش پایگاه داده نشان می دهد.


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");
  }
};

آ
ايجاد كردن
کوئری که در یک تراکنش اجرا می شود معمولاً یک آرایه را می گیرد و برمی گرداند. شما می توانید این را در کد بالا که در آن ایجاد می کند، مشاهده کنید
شغل جدید
و آن را ذخیره می کند
_شناسه
ملک در

مطلب مرتبط:   10 ابزار مفید برای توسعه دهندگان پایتون

newJobId
متغیر.

در اینجا نمایشی از نحوه عملکرد توابع بالا آورده شده است:

const mockUser = {
  name: "Timmy Omolana",
  email: "jobposter@example.com",
};
 
const mockJob = {
  title: "Sales Manager",
  location: "Lagos, Nigeria",
  salary: "$40,000",
  userEmail: "jobposter@example.com", // email of the created user
};
 
const startServer = async () => {
  await connectDb();
  await createUser(mockUser);
  await createJob(mockJob);
};
 
startServer()
  .then()
  .catch((err) => console.log(err));

اگر این کد را ذخیره کرده و با استفاده از دستور npm start یا node اجرا کنید، باید خروجی مانند زیر تولید کند:

خروجی تراکنش های پایگاه داده

روش دیگر پیاده سازی تراکنش های ACID در MongoDB با استفاده از Mongoose استفاده از تابع withTransaction() است. این رویکرد انعطاف پذیری کمی را فراهم می کند زیرا تمام پرس و جوها را در داخل یک تابع callback اجرا می کند که به عنوان آرگومان به تابع ارسال می کنید.

می‌توانید تراکنش پایگاه داده بالا را برای استفاده از withTransaction () به این صورت تغییر دهید:

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");
  }
};

این همان خروجی اجرای قبلی را تولید می کند. شما مختار هستید که در هنگام اجرای تراکنش های پایگاه داده در MongoDB از کدام سبک استفاده کنید.

مطلب مرتبط:   نحوه اضافه کردن دوربین به بازی های آرکید در پایتون

این پیاده سازی از
commitTransaction()
و
abortTransaction()
کارکرد. این به این دلیل است که
withTransaction()
تابع به طور خودکار تراکنش های موفق را انجام می دهد و تراکنش های ناموفق را لغو می کند. تنها تابعی که باید در همه موارد فراخوانی کنید، این است
session.endSession()
تابع.

پیاده سازی تراکنش های پایگاه داده ACID در MongoDB

تراکنش های پایگاه داده زمانی که به درستی انجام شوند به راحتی قابل استفاده هستند. اکنون باید بدانید که تراکنش های پایگاه داده در MongoDB چگونه کار می کنند و چگونه می توانید آنها را در برنامه های Node.js پیاده سازی کنید.

برای بررسی بیشتر ایده تراکنش های ACID و نحوه کار آنها در MongoDB، ساخت یک کیف پول فین تک یا برنامه وبلاگ نویسی را در نظر بگیرید.