2009-08-20 10 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

यह सवाल नहीं था, "savepoints" एक बात है "नेस्टेड लेनदेन" समर्थन असली सवाल था। [यह लिंक] देखें (http://docs.oracle.com/cd/E17076_02/html/gsg_txn/C/nestedtxn.html) – arod

+1

@arod: क्या आप कृपया एकल-थ्रेडेड संदर्भ में अंतर को समझा सकते हैं? धन्यवाद! – Quassnoi

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()); 
14
MySQL प्रलेखन से

:

लेनदेन नेस्ट नहीं किया जा सकता। जब आप स्टार्ट ट्रांज़ेक्शन स्टेटमेंट या उसके समानार्थी शब्द जारी करते हैं तो यह किसी भी मौजूदा लेनदेन के लिए किए गए निहित प्रतिबद्धता का परिणाम है। https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

संबंधित मुद्दे