เราจะมาดูกันว่า Prisma Transactions คืออะไร และวิธีการใช้งานมันให้ได้ประโยชน์สูงสุด พร้อมข้อควรระวังที่ควรพิจารณาเมื่อใช้งาน
Prisma Transactions คืออะไร?
Prisma Transactions คือฟีเจอร์ใน Prisma ORM ที่ช่วยให้เราสามารถทำหลายคำสั่งในฐานข้อมูลพร้อมกันได้ในลักษณะอะตอม (atomic) ถ้าการทำงานใดๆ ล้มเหลว Prisma จะทำการยกเลิกทุกการเปลี่ยนแปลงที่เกิดขึ้นใน transaction นั้นๆ เพื่อไม่ให้ข้อมูลในฐานข้อมูลเกิดความผิดพลาดหรือไม่สมบูรณ์
การใช้ transaction ช่วยให้เรามั่นใจได้ว่า
- ทุกการเปลี่ยนแปลงในฐานข้อมูลจะเกิดขึ้นพร้อมกัน ถ้ามีข้อผิดพลาดเกิดขึ้น ทุกอย่างจะถูกยกเลิกไปทั้งหมด
- ถ้ามีข้อผิดพลาด ระบบจะไม่ทิ้งข้อมูลที่ไม่สมบูรณ์ในฐานข้อมูล
- ช่วยให้เราสามารถทำหลายๆ การเปลี่ยนแปลงกับข้อมูลในครั้งเดียวได้อย่างมั่นใจและปลอดภัย
การใช้งาน Prisma Transaction
1. การใช้ $transaction
การใช้ฟังก์ชัน prisma.$transaction() จะทำให้คำสั่งที่ต้องการทำงานร่วมกันในฐานข้อมูลถูกดำเนินการใน transaction เดียวกัน เช่น การสร้างผู้ใช้และโพสต์ในฐานข้อมูล
const result = await prisma.$transaction(async (prisma) => {
const user = await prisma.user.create({
data: {
name: 'John Doe',
email: '[email protected]',
},
});
const post = await prisma.post.create({
data: {
title: 'My First Post',
content: 'This is the content of my first post.',
authorId: user.id,
},
});
return { user, post };
});
ในตัวอย่างนี้ ทุกคำสั่งจะถูกห่อหุ้มภายใน transaction เดียวกัน ถ้ามีคำสั่งใดคำสั่งหนึ่งล้มเหลว ทุกการเปลี่ยนแปลงจะถูกยกเลิก
2. การใช้ Nested Transactions
Prisma รองรับการใช้ transaction ซ้อนกัน (nested transactions) ซึ่งมีประโยชน์หากคุณต้องการควบคุมหลายๆ ขั้นตอนที่แตกต่างกัน
await prisma.$transaction(async (prisma) => {
await prisma.user.create({ data: { name: 'John' } });
await prisma.$transaction(async (prisma) => {
await prisma.post.create({ data: { title: 'New Post', authorId: 1 } });
});
});
อย่างไรก็ตาม การใช้ nested transactions มักจะไม่จำเป็น เพราะ $transaction เพียงครั้งเดียวสามารถทำให้การทำงานทั้งหมดเกิดขึ้นใน transaction เดียว
3. การรวมการคิวรีที่อ่านและเขียนใน Transaction เดียว
Prisma อนุญาตให้เราทำการอ่านและเขียนในฐานข้อมูลภายใน transaction เดียวกัน ซึ่งเหมาะสำหรับสถานการณ์ที่เราต้องใช้ข้อมูลที่ดึงมาเพื่อตัดสินใจในการเขียนข้อมูลเพิ่มเติม
const result = await prisma.$transaction(async (prisma) => {
const user = await prisma.user.findUnique({
where: { email: '[email protected]' },
});
if (user) {
const updatedUser = await prisma.user.update({
where: { id: user.id },
data: { name: 'John Doe Updated' },
});
return updatedUser;
}
});
ข้อควรระวังในการใช้งาน Prisma Transaction
-
การใช้งาน Nested Transactions มากเกินไป
แม้ว่า Prisma รองรับ nested transactions, ควรใช้ฟีเจอร์นี้อย่างระมัดระวัง เพราะการใช้หลายๆ transaction ซ้อนกันอาจทำให้โค้ดซับซ้อนและส่งผลกระทบต่อประสิทธิภาพ
-
การทำงานกับข้อมูลจำนวนมาก
การทำงานกับข้อมูลจำนวนมากใน transaction เดียวอาจทำให้ประสิทธิภาพการทำงานของฐานข้อมูลลดลง หากข้อมูลมากเกินไปควรพิจารณาการแบ่ง transaction ออกเป็นหลายๆ ส่วน
-
การใช้ $transaction อย่างไม่จำเป็น
การใช้ $transaction สำหรับการคิวรีที่ไม่จำเป็นต้องใช้ transaction อาจทำให้ระบบทำงานช้าลง ควรเลือกใช้อย่างระมัดระวังเฉพาะกรณีที่ต้องการให้หลายๆ การกระทำดำเนินการในลักษณะอะตอม
สรุป
การใช้ Prisma Transactions ช่วยให้คุณสามารถจัดการหลายคำสั่งในฐานข้อมูลได้ในครั้งเดียวแบบอะตอม ซึ่งหมายความว่า ทุกคำสั่งจะต้องสำเร็จหรือทั้งหมดจะถูกยกเลิก ทำให้ข้อมูลถูกจัดการอย่างถูกต้องและปลอดภัย อย่างไรก็ตาม ควรใช้ Prisma Transactions อย่างระมัดระวัง เพื่อหลีกเลี่ยงปัญหาด้านประสิทธิภาพในการทำงานนะครับ