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

이것은 "저장 점"이 "중첩 된 트랜잭션"지원이 진정한 질문이었습니다. [이 링크] (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의, 그리고 확장을 지원할 수 있습니다. MySQL의 문서에서

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()); 
관련 문제