ทำความเข้าใจ Prisma Transactions

Nov. 14, 2024 · boychawin

เราจะมาดูกันว่า 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

  1. การใช้งาน Nested Transactions มากเกินไป

    แม้ว่า Prisma รองรับ nested transactions, ควรใช้ฟีเจอร์นี้อย่างระมัดระวัง เพราะการใช้หลายๆ transaction ซ้อนกันอาจทำให้โค้ดซับซ้อนและส่งผลกระทบต่อประสิทธิภาพ

  2. การทำงานกับข้อมูลจำนวนมาก

    การทำงานกับข้อมูลจำนวนมากใน transaction เดียวอาจทำให้ประสิทธิภาพการทำงานของฐานข้อมูลลดลง หากข้อมูลมากเกินไปควรพิจารณาการแบ่ง transaction ออกเป็นหลายๆ ส่วน

  3. การใช้ $transaction อย่างไม่จำเป็น

    การใช้ $transaction สำหรับการคิวรีที่ไม่จำเป็นต้องใช้ transaction อาจทำให้ระบบทำงานช้าลง ควรเลือกใช้อย่างระมัดระวังเฉพาะกรณีที่ต้องการให้หลายๆ การกระทำดำเนินการในลักษณะอะตอม

สรุป

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