การเรียนรู้ MongoDB Transactions
บทนำ
MongoDB Transactions ช่วยให้สามารถจัดการชุดของการดำเนินการ (operations) หลายรายการได้ในลักษณะของ "atomicity" (การทำงานทั้งหมดสำเร็จหรือไม่สำเร็จเลย) ทำให้มั่นใจได้ว่าข้อมูลมีความถูกต้องและสอดคล้องกัน การใช้งาน Transactions มีความสำคัญในแอปพลิเคชันที่ต้องการความแม่นยำของข้อมูล เช่น ระบบการเงินหรือระบบการจอง
คุณสมบัติของ MongoDB Transactions
- Atomicity: ทุกการดำเนินการใน Transaction จะสำเร็จพร้อมกันหรือยกเลิกทั้งหมด
- Consistency: ข้อมูลจะอยู่ในสถานะที่สอดคล้องกันตลอดเวลา
- Isolation: การดำเนินการใน Transaction หนึ่งจะไม่ส่งผลกระทบต่อ Transaction อื่น
- Durability: การเปลี่ยนแปลงข้อมูลใน Transaction จะถูกบันทึกอย่างถาวร
การใช้งาน Transactions ใน MongoDB
ข้อกำหนดเบื้องต้น
- MongoDB Transactions รองรับเฉพาะใน Replica Set หรือ Sharded Cluster
- MongoDB เวอร์ชัน 4.0 ขึ้นไป รองรับ Transactions สำหรับ Replica Set
- 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
- ประสิทธิภาพ:
- การใช้ Transactions อาจทำให้การดำเนินการช้าลง เนื่องจากต้องรอการยืนยันและการล็อกข้อมูล
- ขนาด Transaction:
- Transaction มีข้อจำกัดเรื่องขนาดสูงสุดของเอกสารที่สามารถเปลี่ยนแปลงได้ (16MB)
- Timeout:
- Transaction ที่ใช้เวลานานเกินไปอาจถูกยกเลิกโดยอัตโนมัติ (ค่าเริ่มต้นคือ 60 วินาที)
สรุป
MongoDB Transactions ช่วยเพิ่มความน่าเชื่อถือของข้อมูลในแอปพลิเคชันที่ต้องการความแม่นยำสูง การเข้าใจและใช้งาน Transactions อย่างเหมาะสมจะช่วยให้การจัดการข้อมูลในระบบมีประสิทธิภาพและปลอดภัยมากขึ้น