January 21st, 2010
aErOnz`Atomic transaction with ActiveRecord
No Comments », Database, General, Programming Tips, Ruby On Rails, Web Development, by aErOnz`สวัสดีครับ วันนี้จะมาพูดถึงเรื่อง 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`
- aErOnz`Can't convert value ‘0000-00-00 00:00:00′ to TIMESTAMP - January 27th, 2010
- aErOnz`Groovy On Grails "Hello World" with Netbeans - November 25th, 2009
- aErOnz`Groovy On Grails Introduction - November 25th, 2009
- aErOnz`[SQL] How to select NULL value - November 13th, 2009
- aErOnz`Grant user for MySQL database - November 12th, 2009
