แอปพลิเคชันของเรายิงแบบสอบถาม INSERT ไปยังฐานข้อมูล MySQL เพื่อเพิ่มบันทึก ฉันต้องการทราบว่าบันทึกได้รับการกำหนดอัตโนมัติหรือไม่ ถ้าฉันรันคำสั่ง ROLLBACK ฐานข้อมูลจะทำการย้อนกลับเมื่อใด การย้อนกลับเป็นไปได้หลังจากคอมมิชชันหรือไม่?
แอปพลิเคชันของเรายิงแบบสอบถาม INSERT ไปยังฐานข้อมูล MySQL เพื่อเพิ่มบันทึก ฉันต้องการทราบว่าบันทึกได้รับการกำหนดอัตโนมัติหรือไม่ ถ้าฉันรันคำสั่ง ROLLBACK ฐานข้อมูลจะทำการย้อนกลับเมื่อใด การย้อนกลับเป็นไปได้หลังจากคอมมิชชันหรือไม่?
คำตอบ:
คำตอบสำหรับคำถามของคุณขึ้นอยู่กับว่าคุณอยู่ในธุรกรรมที่จะขยายงบมากกว่าหนึ่งรายการหรือไม่ (คุณติดแท็กคำถามกับ InnoDB คำตอบจะแตกต่างจาก MyISAM)
จากคู่มืออ้างอิง: http://dev.mysql.com/doc/refman/5.1/en/commit.html
โดยค่าเริ่มต้น MySQL จะทำงานโดยเปิดใช้งานโหมดปรับแต่งอัตโนมัติ ซึ่งหมายความว่าทันทีที่คุณดำเนินการคำสั่งที่อัปเดต (แก้ไข) ตาราง MySQL จะจัดเก็บการอัปเดตบนดิสก์เพื่อให้ถาวร
ใช่โดยค่าเริ่มต้นหากคุณเพิ่งใช้INSERT
งานระเบียนที่คุณแทรกจะถูกกำหนดและไม่มีจุดใดที่พยายามย้อนกลับ (สิ่งนี้มีประสิทธิภาพเหมือนกับการตัดคำสั่งแต่ละรายการระหว่างBEGIN
และCOMMIT
.)
แต่ถ้าคุณจัดการกับการทำธุรกรรมอย่างชัดเจนคุณจะต้องใช้COMMIT
เพื่อกระทำการจัดเก็บระเบียน ROLLBACK
แต่คุณยังจะสามารถที่จะใช้งาน
คุณสามารถเริ่มทำธุรกรรมอย่างชัดเจนโดยใช้START TRANSACTION
(หรือBEGIN
) นี่เป็นอิสระจากการautocommit
ตั้งค่า (โดยค่าเริ่มต้น):
ด้วยการทำธุรกรรมเริ่มต้นการเติมข้อความอัตโนมัติจะยังคงปิดใช้งานจนกว่าคุณจะสิ้นสุดธุรกรรมด้วย COMMIT หรือ ROLLBACK โหมด autocommit จะเปลี่ยนกลับไปเป็นสถานะก่อนหน้า
อีกวิธีหนึ่งถ้าautocommit=0
ฉันคิดว่าคำสั่งใด ๆ ที่ตามหลังการสิ้นสุดธุรกรรมอื่นจะเริ่มต้นธุรกรรม (แต่คุณยังสามารถใช้START TRANSACTION
อย่างชัดเจน) อย่างน้อยฉันก็ตีความสิ่งนี้ :
โหมด autocommit หากตั้งค่าเป็น 1 การเปลี่ยนแปลงทั้งหมดในตารางจะมีผลทันที หากตั้งค่าเป็น 0 คุณต้องใช้ COMMIT เพื่อยอมรับการทำธุรกรรมหรือย้อนกลับเพื่อยกเลิก ถ้า autocommit เป็น 0 และคุณเปลี่ยนเป็น 1, MySQL จะทำการคอมมิทอัตโนมัติของธุรกรรมใด ๆ ที่เปิดอยู่ อีกวิธีหนึ่งในการเริ่มต้นธุรกรรมคือการใช้คำสั่ง START TRANSACTION หรือ BEGIN ดูหัวข้อ 12.3.1“ การทำธุรกรรมเริ่มต้นคอมมิทและย้อนกลับไวยากรณ์”
โดยเฉพาะอย่างยิ่ง "อีกวิธีหนึ่งในการเริ่มต้นธุรกรรม" ดูเหมือนจะบอกเป็นนัยว่าการตั้งค่า "autocommit = 0" นั้นเพียงพอที่จะเริ่มทำธุรกรรม (อย่างน้อยก็ต่อหน้าแต่ละคำสั่งที่เริ่มเซสชันหรือตามด้วยCOMMIT
/ ROLLBACK
) ฉันอยากจะแนะนำให้ใช้BEGIN
หรือSTART TRANSACTION
อย่างชัดเจนแม้ว่าautocommit=0
มันจะทำให้มันชัดเจนยิ่งขึ้นเมื่อเห็นว่าการทำธุรกรรมเริ่มต้นหรือสิ้นสุด
(วิธีที่คุณเริ่มทำธุรกรรมอาจขึ้นอยู่กับวิธีที่แอปพลิเคชันของคุณใช้ MySQL)
โดยค่าเริ่มต้นInnoDB เป็นชุดที่จะ autocommit = 1 หรือบน เมื่อความมุ่งมั่นที่พวกเขาไม่สามารถย้อนกลับ
คุณจะต้องทำหนึ่งในสองสิ่งนี้เพื่อปิดการใช้งานมันไปข้างหน้า
ตัวเลือก 1: เพิ่มส่วนนี้ลงใน /etc/my.cnf แล้วรีสตาร์ท mysql
[mysqld]
autocommit=0
ตัวเลือก 2: ดำเนินการหนึ่งในสิ่งเหล่านี้ในการเปิด DB Conenction ก่อนเริ่มต้น SQL ที่มีความหมายใด ๆ
SET autocommit = 0;
START TRANSACTION;
ภายใต้สองตัวเลือกนี้คุณจะต้องดำเนินการด้วยตนเอง COMMIT หรือ ROLLBACKด้วยตนเอง
ข้อแม้
หากตารางคือ MyISAM คำอธิบายนั้นง่ายกว่า เนื่องจากไม่มีธุรกรรมสำหรับเอนจินการจัดเก็บ MyISAM INSERTs, UPDATE และ DELETE ทั้งหมดที่ดำเนินการจึงเป็นแบบถาวร ไม่มีการย้อนกลับใด ๆ