อนุญาตให้ทำธุรกรรมซ้อนใน MySQL หรือไม่


คำตอบ:


78

InnoDB รองรับ SAVEPOINTSสนับสนุน

คุณสามารถทำสิ่งต่อไปนี้:

CREATE TABLE t_test (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB;

START TRANSACTION;

INSERT
INTO    t_test
VALUES  (1);

SELECT  *
FROM    t_test;

 id
---
  1

SAVEPOINT tran2;

INSERT
INTO    t_test
VALUES  (2);

SELECT  *
FROM    t_test;

 id
---
  1
  2

ROLLBACK TO tran2;

SELECT  *
FROM    t_test;

 id
---
  1

ROLLBACK;

SELECT  *
FROM    t_test;

 id
---

20
นี่ไม่ใช่คำถาม "จุดบันทึก" เป็นสิ่งหนึ่งที่การสนับสนุน "ธุรกรรมซ้อน" เป็นคำถามที่แท้จริง ดูลิงค์นี้
arod

1
@arod: คุณช่วยอธิบายความแตกต่างในบริบทเธรดเดียวได้ไหม ขอบคุณ!
Quassnoi

@Quassnoi ฉันเชื่อว่าคำสั่งที่ออกให้กับ DB นั้นแตกต่างกันใช่ไหม ฉันอาจจะเข้าใจผิด
arod

2
@Quassnoi ลิงก์ที่ฉันให้มาคือเพื่อแสดงว่าตอนนี้รองรับธุรกรรมที่ซ้อนกันแล้ว ตอนนี้เซฟพอยท์มีประสิทธิภาพ แต่ไม่เหมือนกับ BEGIN ที่ซ้อนกัน COMMIT / ROLLBACK (การพูดโดยใช้โปรแกรมการใช้คำสั่ง) แม้ว่าคุณจะค่อนข้างแน่ใจว่าใน "บริบทเธรดเดียว" จะเทียบเท่ากัน ฉันตั้งใจจะตอบคำถามโดยตรง (3 ปีต่อมา :) ...
arod

12
@arod: คุณรู้หรือไม่ว่าลิงค์ที่คุณให้มาไม่มีส่วนเกี่ยวข้องกับ MySQL ใช่หรือไม่?
Quassnoi

39

จากเอกสาร MySQL:

ไม่สามารถซ้อนธุรกรรมได้ นี่เป็นผลมาจากการกระทำโดยนัยที่ดำเนินการสำหรับธุรกรรมปัจจุบันเมื่อคุณออกคำสั่ง START TRANSACTION หรือคำพ้องความหมายอย่างใดอย่างหนึ่ง https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.