ฉันทำแบบสอบถามโดยไม่มีข้อผูกมัด จากนั้นแอปพลิเคชันก็หยุดลง
ฉันจะแสดงธุรกรรมที่เปิดอยู่เหล่านี้และกระทำหรือยกเลิกได้อย่างไร
ฉันทำแบบสอบถามโดยไม่มีข้อผูกมัด จากนั้นแอปพลิเคชันก็หยุดลง
ฉันจะแสดงธุรกรรมที่เปิดอยู่เหล่านี้และกระทำหรือยกเลิกได้อย่างไร
คำตอบ:
ฉันจะแสดงธุรกรรมที่เปิดอยู่เหล่านี้และกระทำหรือยกเลิกได้อย่างไร
ไม่มีธุรกรรมที่เปิดอยู่ MySQL จะย้อนกลับธุรกรรมเมื่อตัดการเชื่อมต่อ
คุณไม่สามารถทำธุรกรรม (IFAIK) ได้
คุณแสดงเธรดโดยใช้
SHOW FULL PROCESSLIST
ดู: http://dev.mysql.com/doc/refman/5.1/th/thread-information.html
มันจะไม่ช่วยคุณเพราะคุณไม่สามารถทำธุรกรรมจากการเชื่อมต่อที่ขาด
จะเกิดอะไรขึ้นเมื่อการเชื่อมต่อขาด
จากเอกสาร MySQL: http://dev.mysql.com/doc/refman/5.0/en/mysql-tips.html
4.5.1.6.3 ปิดการใช้งาน mysql Auto-Reconnect
หากไคลเอนต์ mysql สูญเสียการเชื่อมต่อไปยังเซิร์ฟเวอร์ในขณะที่ส่งคำสั่งไคลเอ็นต์จะพยายามเชื่อมต่ออีกครั้งไปยังเซิร์ฟเวอร์ทันทีและส่งคำสั่งอีกครั้ง อย่างไรก็ตามแม้ว่า mysql จะเชื่อมต่อใหม่ได้สำเร็จ แต่การเชื่อมต่อครั้งแรกของคุณก็สิ้นสุดลงและอ็อบเจ็กต์และการตั้งค่าเซสชันก่อนหน้าทั้งหมดของคุณจะหายไป : ตารางชั่วคราวโหมดการสั่งงานอัตโนมัติและตัวแปรที่ผู้ใช้กำหนดและเซสชัน นอกจากนี้ใด ๆ ม้วนธุรกรรมปัจจุบันกลับ
พฤติกรรมนี้อาจเป็นอันตรายสำหรับคุณดังตัวอย่างต่อไปนี้ที่เซิร์ฟเวอร์ถูกปิดและรีสตาร์ทระหว่างคำสั่งที่หนึ่งและสองโดยที่คุณไม่รู้ตัว:
ดูเพิ่มเติมที่: http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html
วิธีวินิจฉัยและแก้ไขใน
การตรวจสอบการเชื่อมต่ออัตโนมัติ:
หากเกิดการเชื่อมต่อใหม่โดยอัตโนมัติ (ตัวอย่างเช่นจากการเรียก mysql_ping ()) จะไม่มีการระบุอย่างชัดเจน ในการตรวจสอบการเชื่อมต่อใหม่ให้โทร
mysql_thread_id()
เพื่อรับตัวระบุการเชื่อมต่อเดิมก่อนโทรmysql_ping()
จากนั้นโทรmysql_thread_id()
อีกครั้งเพื่อดูว่าตัวระบุมีการเปลี่ยนแปลงหรือไม่
ตรวจสอบให้แน่ใจว่าคุณเก็บแบบสอบถามล่าสุด (ธุรกรรม) ไว้ในไคลเอนต์เพื่อให้คุณสามารถส่งได้อีกครั้งหากจำเป็น
และปิดใช้งานโหมดเชื่อมต่อใหม่อัตโนมัติเนื่องจากเป็นอันตรายให้ใช้การเชื่อมต่อใหม่ของคุณเองแทนเพื่อให้คุณทราบว่าเมื่อใดเกิดการตกหล่นและคุณสามารถส่งแบบสอบถามนั้นอีกครั้งได้
mysqld.dll
AKA ไคลเอนต์และคุณเก็บคำสั่ง SQLที่มีธุรกรรมทั้งหมดไว้ในหน่วยความจำเพื่อให้คุณสามารถเล่นได้เมื่อการเชื่อมต่อลดลง หรือคุณเก็บไว้ในดิสก์ดังนั้นเมื่อรีสตาร์ทคุณสามารถส่งใหม่ได้
แม้ว่าในกรณีนี้จะไม่มีธุรกรรมเหลืออยู่ตามที่ @Johan กล่าว แต่คุณสามารถดูรายการธุรกรรมปัจจุบันใน InnoDB พร้อมข้อความค้นหาด้านล่างได้หากต้องการ
SELECT * FROM information_schema.innodb_trx\G
จากเอกสาร :
ตาราง INNODB_TRX ประกอบด้วยข้อมูลเกี่ยวกับทุกธุรกรรม (ไม่รวมธุรกรรมแบบอ่านอย่างเดียว) ที่กำลังดำเนินการภายใน InnoDB รวมถึงว่าธุรกรรมกำลังรอการล็อกหรือไม่เมื่อธุรกรรมเริ่มต้นขึ้นและคำสั่ง SQL ที่ธุรกรรมกำลังดำเนินการอยู่หากมี
\G
ตัวปรับแต่งในตอนท้ายมีประโยชน์เฉพาะในกรณีที่คุณต้องการจัดรูปแบบผลลัพธ์แบบสอบถามภายในเครื่องมือ mysql CLI หากคุณใช้เครื่องมือ GUI เช่น Mysql Workbench คุณไม่จำเป็นต้องใช้
คุณสามารถใช้show innodb status
(หรือshow engine innodb status
สำหรับ mysql เวอร์ชันใหม่กว่า) เพื่อรับรายการของการดำเนินการทั้งหมดที่รอดำเนินการอยู่ภายในโปรแกรม InnoDB ฝังอยู่ในผนังของผลลัพธ์จะเป็นธุรกรรมและรหัสกระบวนการภายในที่พวกเขากำลังทำงานอยู่
คุณจะไม่สามารถบังคับให้กระทำหรือย้อนกลับของธุรกรรมเหล่านั้นได้ แต่คุณสามารถฆ่ากระบวนการ MySQL ที่เรียกใช้งานได้ซึ่งโดยพื้นฐานแล้วจะทำให้เกิดการย้อนกลับ มันฆ่าการเชื่อมต่อของกระบวนการและทำให้ MySQL ล้างความยุ่งเหยิงทางซ้าย
นี่คือสิ่งที่คุณต้องการค้นหา:
------------
TRANSACTIONS
------------
Trx id counter 0 140151
Purge done for trx's n:o < 0 134992 undo n:o < 0 0
History list length 10
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0 0, not started, process no 17004, OS thread id 140621902116624
MySQL thread id 10594, query id 10269885 localhost marc
show innodb status
ในกรณีนี้ตอนนี้มีการเชื่อมต่อกับเอ็นจิ้น InnoDB เพียงครั้งเดียว (การเข้าสู่ระบบของฉันเรียกใช้show
แบบสอบถาม) ถ้าบรรทัดที่มีการเชื่อมต่อที่เกิดขึ้นจริง / kill 10594
รายการติดที่คุณต้องการที่จะยุติแล้วคุณต้องการทำ
show engine innodb status
?
รายการทั้งหมด:
SHOW FULL PROCESSLIST
หากคุณต้องการฆ่ารหัสธุรกรรมคัดลอกรายการแฮงและฆ่าธุรกรรมโดยใช้คำสั่งนี้:
KILL <id> // e.g KILL 16543