สวัสดีครับ วันนี้จะมาพูดถึงเรื่อง Transaction ว่ามันคืออะไรกัน แล้วมันสำคัญอย่างไรกับชีวิตนักพัฒนาโปรแกรมของเรากัน
สมมติว่า นาย aeronz มีเงินในบัญชีอยู่ 2000 บาท และต้องการจะโอนเงินให้นาย Porza 500บาท (ในการดำเนินการใดๆ ซึ่งที่นี้คือการโอนเงิน จะเรียกว่า 1 transaction ครับ)
โดยในขณะนั้นบัญชีของนาย Porza มีเงินอยู่ 0 บาท
ขั้นตอนการโอนเงินก็คือ
1. หักเงินจากบัญชีนาย aeronz 500 บาท (เหลือ 1500 บาท)
2. เพิ่มเงินให้นาย Porza 500 บาท (ยอดบัญชีนาย Porza จะเป็น 500 บาท)

จะเกิดอะไรขึ้น ถ้า พอระบบทำขั้นตอนที่ 1 เสร็จสิ้นแล้ว แต่ยังไม่ทันที่จะทำขั้นที่ 2 ระบบเกิดมีปัญหาขึ้นมา
หากไม่ได้รับมือกับปัญหานี้ ผลที่เกิดขึ้น คือ
เงินบัญชีนาย aeronz เหลือ 1500 บาท เงินในบัญชีนาย Porza คือ 0 บาท

เราต้องทำยังไงหล่ะ ?
ถ้าใครสนใจก็ตามเข้ามาเลยครับ

จากบัญหาข้างต้น สิ่งที่ดีที่สุดที่เราจะทำก็คือหากเราทำ กระบวนการทั้งหมด (ทั้งข้อ 1 และ 2)ไม่สำเร็จ ระบบก็ควรที่จะไม่เปลี่ยนแปลงอะไรเลย
คือ เงินบัญชีนาย aeronz เหลือ 2000 บาท เงินในบัญชีนาย Porza คือ 0 บาท เหมือนเดิม

เพราะฉะนั้น เวลาเราเขียนโปรแกรม หรือทำระบบที่มีการดำเนินการใดๆ (Transaction) เราต้องคำนึงถึงเรื่องนี้ไว้ด้วยครับ
ในการย้อนกลับหากการดำเนินการไม่สำเร็จ เราจะเรียกว่าการ roll back ครับ ซึ่งใน ActiveRecord ของ ROR ก็มีการเขียนโค้ดเพื่อเตรียมป้องกันเหตุการเหล่านี้ดังนี้ครับ

aeronz = Account.find(1)
porza = Account.find(2)
 
Account.transaction do
  aeronz.withdrawal(500)
  porza.deposit(500)
end

หรือ

aeronz = Account.find(1)
porza = Account.find(2)
 
ActiveRecord::Base.transaction do
  aeronz.withdrawal(500)
  porza.deposit(500)
end

เพราะว่าโมเดลใน RoR มีการสืบทอดมาจาก คลาส ActiveRecord::Base ครับ

ครับ ตอนนี้เราก็ได้ concept ของ Transaction และวิธีการในการ RollBack ข้อมูล เมื่อเกิดปัญหาด้วย ActiveRecord ใน RoR กันแล้วนะครับ
ถ้าใครสนใจ อาจจะไปอ่านเพิ่มเิติมได้ ที่นี่ ครับ
ไว้เจอกันใหม่ครับ

Last 5 posts by aErOnz`

Leave a Reply