Skip to main content

การเรียนรู้ MongoDB Transactions

บทนำ​

MongoDB Transactions ช่วยให้สามารถจัดการชุดของการดำเนินการ (operations) หลายรายการได้ในลักษณะของ "atomicity" (การทำงานทั้งหมดสำเร็จหรือไม่สำเร็จเลย) ทำให้มั่นใจได้ว่าข้อมูลมีความถูกต้องและสอดคล้องกัน การใช้งาน Transactions มีความสำคัญในแอปพลิเคชันที่ต้องการความแม่นยำของข้อมูล เช่น ระบบการเงินหรือระบบการจอง


คุณสมบัติของ MongoDB Transactions​

  • Atomicity: ทุกการดำเนินการใน Transaction จะสำเร็จพร้อมกันหรือยกเลิกทั้งหมด
  • Consistency: ข้อมูลจะอยู่ในสถานะที่สอดคล้องกันตลอดเวลา
  • Isolation: การดำเนินการใน Transaction หนึ่งจะไม่ส่งผลกระทบต่อ Transaction อื่น
  • Durability: การเปลี่ยนแปลงข้อมูลใน Transaction จะถูกบันทึกอย่างถาวร

การใช้งาน Transactions ใน MongoDB​

ข้อกำหนดเบื้องต้น​

  1. MongoDB Transactions รองรับเฉพาะใน Replica Set หรือ Sharded Cluster
  2. MongoDB เวอร์ชัน 4.0 ขึ้นไป รองรับ Transactions สำหรับ Replica Set
  3. MongoDB เวอร์ชัน 4.2 ขึ้นไป รองรับ Transactions สำหรับ Sharded Cluster

ขั้นตอนการใช้งาน Transactions​

1. สร้าง Session​

การใช้งาน Transactions ต้องเริ่มต้นด้วยการสร้าง session

// เริ่มต้น session
const session = db.getMongo().startSession();

2. เริ่มต้น Transaction​

ใช้คำสั่ง session.startTransaction() เพื่อเริ่มต้น Transaction

// เริ่มต้น transaction
session.startTransaction();

3. ดำเนินการคำสั่งใน Transaction​

ดำเนินการคำสั่งที่ต้องการใน Transaction ผ่าน session

try {
// ดำเนินการคำสั่งใน transaction
session.getDatabase("myDatabase").myCollection.insertOne(
{ name: "John Doe", balance: 1000 },
{ session }
);

session.getDatabase("myDatabase").myCollection.updateOne(
{ name: "John Doe" },
{ $inc: { balance: -500 } },
{ session }
);

// ยืนยัน Transaction
session.commitTransaction();
console.log("Transaction สำเร็จ");
} catch (error) {
// ยกเลิก Transaction หากเกิดข้อผิดพลาด
session.abortTransaction();
console.error("Transaction ล้มเหลว:", error);
} finally {
// ปิด session
session.endSession();
}

ตัวอย่างการใช้งานจริง​

ตัวอย่าง: ระบบโอนเงินระหว่างบัญชี​

const session = db.getMongo().startSession();

try {
session.startTransaction();

const accounts = session.getDatabase("bank").accounts;

// หักเงินจากบัญชีผู้โอน
accounts.updateOne(
{ accountNumber: "123456" },
{ $inc: { balance: -500 } },
{ session }
);

// เพิ่มเงินให้บัญชีผู้รับ
accounts.updateOne(
{ accountNumber: "654321" },
{ $inc: { balance: 500 } },
{ session }
);

// ยืนยัน Transaction
session.commitTransaction();
console.log("Transaction สำเร็จ");
} catch (error) {
// ยกเลิก Transaction หากเกิดข้อผิดพลาด
session.abortTransaction();
console.error("Transaction ล้มเหลว:", error);
} finally {
session.endSession();
}

ข้อควรระวังในการใช้งาน Transactions​

  1. ประสิทธิภาพ:
    • การใช้ Transactions อาจทำให้การดำเนินการช้าลง เนื่องจากต้องรอการยืนยันและการล็อกข้อมูล
  2. ขนาด Transaction:
    • Transaction มีข้อจำกัดเรื่องขนาดสูงสุดของเอกสารที่สามารถเปลี่ยนแปลงได้ (16MB)
  3. Timeout:
    • Transaction ที่ใช้เวลานานเกินไปอาจถูกยกเลิกโดยอัตโนมัติ (ค่าเริ่มต้นคือ 60 วินาที)

สรุป​

MongoDB Transactions ช่วยเพิ่มความน่าเชื่อถือของข้อมูลในแอปพลิเคชันที่ต้องการความแม่นยำสูง การเข้าใจและใช้งาน Transactions อย่างเหมาะสมจะช่วยให้การจัดการข้อมูลในระบบมีประสิทธิภาพและปลอดภัยมากขึ้น