2009-08-20 128 views

回答

59

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 
--- 
+0

謝謝,我會記住這一點以備將來參考。 – 2009-08-20 15:27:20

+11

這不是問題,「保存點」是一件事情,「嵌套事務」支持纔是真正的問題。請參閱[此鏈接](http://docs.oracle.com/cd/E17076_02/html/gsg_txn/C/nestedtxn.html) – arod 2012-09-02 20:41:23

+1

@arod:請您介紹一下單線程上下文中的差異嗎?謝謝! – Quassnoi 2012-09-02 21:20:43

0

如果您使用PHP,那麼你可以是有趣的https://github.com/Enelar/phpsql 它支持MySQL和pgsql的,並可延伸到其它連接器。

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());