2009-08-20 6 views

答えて

59

InnoDBSAVEPOINTSをサポートします。

次の操作を行うことができます

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

感謝をサポートしていない、私は今後の参考のためには、このことを覚えておこう。 –

+11

これは問題ではありませんでした。 "セーブポイント"は、 "ネストされたトランザクション"のサポートが本当の問題だったことの1つです。 [このリンク](http://docs.oracle.com/cd/E17076_02/html/gsg_txn/C/nestedtxn.html)を参照してください。 – arod

+1

@arod:シングルスレッド・コンテキストの違いを説明できますか?ありがとう! – Quassnoi

0

あなたがPHPを使用している場合、あなたはそれは、MySQLとpgsqlで、及び他のコネクタへの拡張をサポートhttps://github.com/Enelar/phpsql に面白いかもしれません。

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

MySQLのドキュメントから:

トランザクションは入れ子にすることはできません。これは、START TRANSACTION文またはその同義語の1つを発行するときに、現行のトランザクションに対して暗黙的にコミットされた結果です。 https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

関連する問題