ก็เขาจัดงานที่ The Street รัชดาที่ชั้น 3 Horizon ซึ่งเป็นเหมือนห้องซ้อมดนตรีอะนะ ซึ่งเขาไปจัดในห้องที่จัดการแสดงได้ น้องก็แสดงเพลงของวงเพลงต่างๆไล่ตาม Single ไปตั้งแต่ Single แรก Mirror -> เป็ด -> Which Witch รอบนี้ได้ฟังเสียงแบบเต็มๆ คือฟังแล้วสนุกมาก ดีกว่าตอนฟังที่งาน Idol หลายเท่าตัว จากนั้นน้องก็เริ่มแสดงเพลงของ Unit ตัวเอง โดยเริ่มจาก
อันนี้คุยแน่นอนอยู่ละเพราะเป็นขวัญใจ ซึ่งก็นั่งคุยเรื่องความหมายของเพลงต่อว่าเพลงที่เหลือคือเพลงอะไร น้องเลือกเพราะอะไร ซึ่งถ้าจำไม่ผิดคือเพลง I like you ของนักร้องสักคนซึ่งผมน่าจะต้องไปไล่หาเปิดต้นฉบับกับความหมายของมัน ส่วนอีกเพลงคือ never enough ของใครสักคน ซึ่งต้องบอกตามตรงว่าผมไม่สันทัดเพลงที่ไม่ใช่เพลงไทย จะฟังเพลงต่างประเทศก็เพลงพวกประกอบละคร หนัง การ์ตูน ถึงจะพอคุ้นหู ซึ่งก็มีเหตุผลว่า I like you แปลว่า หนูชอบแฟนคลับทุกคน ส่วน never enough เท่าไหร่ก็ไม่พอเหมือนความรักที่พวกเรามีให้กันประมาณนั้น สุดท้ายเวลาก็หมดลง ก็เลยบอกลาน้องว่า นี่คงเป็นครั้งสุดท้ายจริงๆแล้วนะ หวังว่าโอกาสหน้าเราจะได้คุยกันใหม่นะ น้องก็บอกว่าค่ะพี่เบล พี่ยังเป็น My Moon ของหนูนะ ตอนนั้นไม่ได้ตอบอะไรน้อง แต่จริงๆแล้วสำหรับพี่น้องก็คือ My Moon เหมือนกัน
คำตอบคือ แค่สั่งเองจ้าตัวคนเขียน DBMS เขากำหนดคำสั่งให้เราแล้วโดยคำสั่งที่ว่านั้น Begin , Commit , Abort (บาง DBMS อาจเรียกแตกต่างกันเช่น Begin บางที่เรียก Set auto commit off , Abort เรียก Rollback)
Process A ต้องการหักเงินจากบัญชีของคุณเป็นจำนวนเงิน 100 บาท
Process B ต้องการหักเงินจากบัญชีของคุณเป็นจำนวนเงิน 200 บาท
เงินในบัญชีคือ 500
ปัญหาแรกที่เราจะพูดถึงคือ Lost update Problem ตัวอย่างคือ Process A อ่านค่าเงินออกไป 500 คำนวนแล้วจะต้องบันทึกข้อมูลไปเป็นจำนวน 400 ส่วน Process B ก็อ่านเงินออกไป 500 ไปคำนวนแล้วต้องบันทึกเป็นเงิน 300 ลง Database จะเห็นว่า Process B ทำการบันทึกค่าจากนั้น Process A ทำการบันทึกค่าจะเห็นว่าการบันทึกค่าของ Process B หายไปเหลือแต่การบันทึกค่าของ Process A (ซึ่งก็ไม่ถูกอยู่ดี)
ปัญหา Dirty Read
สมมุติกรณีเป็น
Process A เป็นงาน Batch ทำการตัดเงินจากบัญชีหลายรายการโดยตัด 2 รายการ รายการแรก 100 รายการที่สอง 100 Process B ดึงข้อมูลเงินในบัญชีออกไปเพื่อไปแสดงผลให้ลูกค้าดู
เงินในบัญชีคือ 500
ปัญหาต่อมาคือ Dirty Read ว่าง่ายๆคือเรากำลังอ่านข้อมูลที่ยังไม่สมบูรณ์ ถ้าในตัวอย่างคือ Process A กำลังทำงาน Batch ตัดเงินในบัญชีอยู่ ระหว่างที่กำลังตัดรายการแรกเสร็จ ตัว Process B เข้ามาทำการอ่านข้อมูลไปแสดงผลว่าบัญชีมีเงินอยู่เท่าไหร่ เพื่อเอาไปใช้ในงานสำคัญบางประการ ซึ่งเข้ามาอ่านตอนที่ Process A ยังทำงานไม่เสร็จทำให้อ่านข้อมูลที่ยังไม่เสร็จไป
ปัญหา Non Repeatable Read
สมมุติกรณีเป็น
Process A อ่านข้อมูลทุกบัญชีในธนาคารเพื่อ Sum ยอดรวมออก Report
Process B ต้องการหักเงินจากบัญชีของคุณเป็นจำนวนเงิน 200 บาท
เงินในบัญชีคือ 500
ปัญหาต่อมาจะพูดกันคือ Non Repeatable Read ว่าง่ายๆคืออ่านถ้าอ่านข้อมูลสองรอบแล้วได้ค่าไม่เท่ากัน (คาดหวังว่าจะอ่านทุกครั้งแล้วได้ค่าเหมือนเดิม แม้จะไม่เข้าไปอ่านก็ตาม) ดังตัวอย่างในภาพ Process A ดึงข้อมูลทุกบัญชีเพื่อไปออก Report ในระหว่างนั้นมี Process B เข้ามาทำการเขียนข้อมูลลงใน Account X ทำให้ค่าเงินมันเปลี่ยนไปส่งผลให้รายงานที่ออกมีข้อมูลไม่ถูกต้อง (จริงๆปัญหา Lost update อันแรกก็เกิดจาก Non Repeatable Read เหมือนกัน)
วิธีแก้นั้นมีแล้ว ง่ายมากๆ ใช้ Lock ไงล่ะ
วิธีการแก้ปัญหาพวกนี้นั้นมีอยู่แล้วครับ ไม่ยากด้วย (แต่ดีรึเปล่าอีกเรื่อง) วิธีแก้ปัญหาเหล่านั้นก็คือ Lock ข้อมูลที่จะใช้เลยจ้า ตัวอย่างเช่น ถ้าเราต้องการจะ Update ข้อมูลบัญชี X เราก็ Lock บัญชี X ไปเลย เราจะเป็นคนเดียวที่ใช้บัญชี X ได้ คนอื่นที่จะมาใช้งานจะต้องรอจนกว่าเราใช้เสร็จถึงจะเข้าไปงานบัญชี X ได้ดังตัวอย่าง Lost update ถ้าเราใช้ Lock ช่วยก็การทำงานจะเป็นดังภาพด้านล่าง ซึ่งผลลัพธ์ที่ออกมานั้นถูกต้อง
แต่เดี๋ยวก่อนนะครับอย่าพึ่งดีใจกันไปถ้าทุกอย่างมันง่ายอย่างงี้ก็คงดี คือเมื่อเราเริ่มใช้ Lock ปัญหาต่อมาก็คือ เราไม่สามารถใช้งานข้อมูลนั้นได้เลย ถ้าสมมุติมี Process ที่ต้องการเข้ามาแค่อ่านข้อมูลเฉยๆ ไม่ได้จะแก้ แต่เมื่อใช้งาน Lock แล้วกลายเป็นว่าต้องรอให้ Process ก่อนหน้าทำงานเสร็จก่อนดังภาพ ซึ่งการเกิดปัญหาความเร็วในการทำงานโดยรวมขึ้นมานั่นเอง
ในตัวอย่างที่ผ่านๆมาการ Lock นั้นเข้าถึงข้อมูลตัวเดียว และ Process ที่เข้ามาใช้งานมีแค่ 2 Process แต่ถ้า Process ที่เข้ามาใช้งานมีหลายตัวและเข้าถึงข้อมูลหลายตัวเช่นกัน แล้วปัญหาแรกๆที่เราจะเจอเมื่อใช้ Lock คือ Dead lock ซึ่งก็คือสถานะไปต่อไปไม่ได้โดยปัญหาที่แสดงการเกิด Dead lock ได้ง่ายที่สุดคือ