2009-08-20 44 views

Trả lời

59

InnoDB hỗ 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 
--- 
+0

Cảm ơn, tôi sẽ ghi nhớ điều này để tham khảo trong tương lai. –

+11

đây không phải là câu hỏi, "savepoints" là một điều "lồng nhau giao dịch" hỗ trợ là câu hỏi thực sự. Xem [liên kết này] (http://docs.oracle.com/cd/E17076_02/html/gsg_txn/C/nestedtxn.html) – arod

+1

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

0

Nếu bạn sử dụng php, sau đó bạn có thể là thú vị trong https://github.com/Enelar/phpsql Nó hỗ trợ mysql và pgsql, và mở rộng để kết nối khác.

function TransferMoney() 
{ // Nested transaction code could not even know that he nested 
    $trans3 = db::Begin(); 
    if (!db::Query("--Withdraw money from user", [$uid, $amount], true)) 
    return $trans3->Rollback(); 
    db::Query("--Deposit money to system"); 
    return $trans3->Commit(); 
} 

$trans = db::Begin(); 
db::Query("--Give item to user inventory"); 
    $trans2 = $trans->Begin(); 
    $trans2->Query("--Try some actions and then decide to rollback"); 
    $trans2->Rollback(); 
// Commit or rollback depending on money transfer result 
return $trans->Finish(TransferMoney()); 
14

Từ tài liệu MySQL:

Giao dịch không thể được lồng vào nhau. Đây là hậu 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 phát hành một câu lệnh START TRANSACTION 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

Các vấn đề liên quan