Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

จะเกิดอะไรขึ้นกับธุรกรรม MySQL ปัจจุบันหากเซสชันถูกฆ่าโดย DBA


สมมุติว่าถ้าเซสชันถูกฆ่าระหว่างธุรกรรม ธุรกรรม MySQL ปัจจุบันจะถูกย้อนกลับโดย MySQL และสิ้นสุด หมายความว่าการเปลี่ยนแปลงฐานข้อมูลทั้งหมดที่ทำในธุรกรรมปัจจุบันจะถูกลบออก เรียกว่าย้อนกลับโดยปริยายเมื่อเซสชันถูกฆ่า

ตัวอย่าง

สมมติว่าเรามีค่าต่อไปนี้ในตาราง 'เครื่องหมาย'

mysql> เลือก * จากเครื่องหมาย;+------+---------+-----------+-------+| รหัส | ชื่อ | เรื่อง | มาร์ค |+------+---------+-----------+-------+| 1 | อาราฟ | คณิตศาสตร์ | 50 || 1 | Harshit | คณิตศาสตร์ | 55 || 3 | Gaurav | คอมพ์ | 69 || 4 | ราหุล | ประวัติศาสตร์ | 40 || 5 | Yashraj | ภาษาอังกฤษ | 48 || 6 | มานาค | ประวัติศาสตร์ | 70 |+------+---------+---------+---------+6 แถวในชุด (0.00 วินาที) 

ตอนนี้เราเริ่มต้นธุรกรรมใหม่และลบแถวออกจากตาราง 'เครื่องหมาย'

mysql> เริ่มการทำธุรกรรม; แบบสอบถามตกลง 0 แถวได้รับผลกระทบ (0.00 วินาที) mysql> ลบออกจากเครื่องหมายโดยที่ id =4; แบบสอบถามตกลง 1 แถวได้รับผลกระทบ (0.00 วินาที)

ก่อน COMMIT หรือ ROLLBACK ให้เปิดหน้าต่างอื่นเพื่อเรียกใช้ MySQL อินสแตนซ์อื่นและเรียกใช้คำสั่ง SHOW PROCESSLIST ดังนี้ -

mysql> SHOW PROCESSLIST\G****************************** 1. แถว *********** **************** รหัส:2 ผู้ใช้:รูท โฮสต์:localhost:49303 db:queryCommand:เวลาพักเครื่อง:22 สถานะ:ข้อมูล:NULL********** ***************** 2. แถว *************************** รหัส:3 ผู้ใช้:root Host:localhost:49350 db:NULLCommand:Query Time:0 State:NULL Info:show processlist2 rows in set (0.00 วินาที)

ตอนนี้ ฆ่าธุรกรรมปัจจุบันโดยรันคำสั่ง KILL ดังนี้ -

mysql> KILL 2; Query OK, 0 แถวได้รับผลกระทบ (0.00 วินาที)

ตอนนี้เมื่อเรากลับไปที่ธุรกรรมปัจจุบันและคำสั่ง COMMIT จะถูกดำเนินการเป็น follws -

mysql> COMMIT;ERROR 2006 (HY000):เซิร์ฟเวอร์ MySQL หายไปไม่มีการเชื่อมต่อ กำลังพยายามเชื่อมต่อใหม่...รหัสการเชื่อมต่อ:4Current database:queryQuery OK, 0 แถวที่ได้รับผลกระทบ (1.01 วินาที)

คำสั่ง KILL ด้านบน ซึ่งฆ่าเซสชันปัจจุบัน บังคับให้ MySQL ย้อนกลับการเปลี่ยนแปลงที่ทำในธุรกรรมปัจจุบัน สามารถสังเกตได้จากแบบสอบถามต่อไปนี้ว่าไม่มีแถวใดถูกลบออกจากตาราง 'เครื่องหมาย'

mysql> เลือก * จากเครื่องหมาย;+------+---------+-----------+-------+| รหัส | ชื่อ | เรื่อง | มาร์ค |+------+---------+-----------+-------+| 1 | อาราฟ | คณิตศาสตร์ | 50 || 1 | Harshit | คณิตศาสตร์ | 55 || 3 | Gaurav | คอมพ์ | 69 || 4 | ราหุล | ประวัติศาสตร์ | 40 || 5 | Yashraj | ภาษาอังกฤษ | 48 || 6 | มานาค | ประวัติศาสตร์ | 70 |+------+---------+---------+---------+6 แถวในชุด (0.00 วินาที)