Các giao dịch lồng nhau có được phép trong MySQL không?


Câu trả lời:


78

InnoDBhỗ trợ SAVEPOINTS.

Bạn có thể làm như sau:

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
đây không phải là câu hỏi, "điểm lưu" là một thứ hỗ trợ "giao dịch lồng nhau" là câu hỏi thực sự. Xem liên kết này
arod

1
@arod: bạn có thể vui lòng giải thích sự khác biệt trong ngữ cảnh đơn luồng không? Cảm ơn!
Quassnoi

@Quassnoi Tôi tin rằng các lệnh được cấp cho DB khác nhau, phải không? Tôi có thể bị nhầm lẫn
AROD

2
@Quassnoi liên kết mà tôi cung cấp để cho thấy rằng các giao dịch lồng nhau hiện được hỗ trợ. Bây giờ, các điểm lưu rất mạnh, nhưng chúng không giống như BEGIN, COMMIT / ROLLBACK lồng nhau (nói theo chương trình, theo lệnh) mặc dù bạn có vẻ khá chắc chắn rằng trong "ngữ cảnh đơn luồng", chúng tương đương nhau. Tôi dự định giải quyết câu hỏi trực tiếp (3 năm sau :) ...
arod

12
@arod: bạn biết rằng liên kết bạn cung cấp không liên quan gì đến MySQL, phải không?
Quassnoi

38

Từ tài liệu MySQL:

Các giao dịch không thể được lồng vào nhau. Đây là hệ quả của cam kết ngầm được thực hiện cho bất kỳ giao dịch hiện tại nào khi bạn đưa ra câu lệnh BẮT ĐẦU GIAO DỊCH hoặc một trong các từ đồng nghĩa của nó. https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.