2012-12-21 79 views
2

我想知道mysqli-> rollback是否會回滾所有在回滾之前已經提交的查詢。將mysqli-> rollback(),回滾以前提交的每個查詢?

例如,在下面的代碼中,第一個查詢將被提交,但第二個查詢將因「拼寫錯誤的用戶名」而失敗。這是否意味着回滾之前的查詢將執行或不執行?

$mysqli->autocommit(FALSE); 

$query = "INSERT INTO users (username, password) VALUES ('user123', '1apple')"; 
$query2 = "INSERT INTO users (**usernam**, password) VALUES ('user987', '2apple')"; 

if($resrouce = $mysqli->query($query)){ 

    $mysqli->commit(); 

    if($resource2 = $mysqli->query($query2)){ 

     $mysqli->commit(); 

    }else{ 

     $mysqli->rollback(); 

    } 

}else{ 
    $mysqli->rollback(); 
} 
+1

回滾只回滾尚未提交的語句... – eggyal

回答

4

一旦你提交事務,你不能回滾它,你只能回滾未comited尚未

+1

那麼,您可以執行[時間點恢復](http://dev.mysql.com/doc/en/point-in-time-recovery.html)。 ..但是你是對的,這並不是真正意義上的「回滾」。 – eggyal

-3

我個人認爲PDO圖書館更好地爲比mysqli的數據庫訪問的聲明。您可以檢查: http://php.net/manual/en/pdo.begintransaction.php

這不正是你需要的...希望幫助

+2

PDO以什麼方式啓用回滾提交的事務? – eggyal

+0

http://php.net/manual/en/pdo.begintransaction.php 手冊的前兩行...? – Feras

+0

嗯,手冊不幸含糊不清。除非通過調用PDO :: commit()*結束事務,否則不會提交第二句「通過PDO對象實例對數據庫所做的更改」。第三個句子「*調用PDO :: rollBack()將回滾對數據庫的所有更改並將連接返回到自動提交模式。*」應該更清楚,只有在當前事務中進行的未提交更改/更改纔會回滾。 – eggyal

1

修改8號線,並在你的代碼的末尾添加一行:

$mysqli->autocommit(FALSE); 

$query = "INSERT INTO users (username, password) VALUES ('user123', '1apple')"; 
$query2 = "INSERT INTO users (**usernam**, password) VALUES ('user987', '2apple')"; 

if($resrouce = $mysqli->query($query)){ 

    //$mysqli->commit(); this not necesary 

    if($resource2 = $mysqli->query($query2)){ 

     $mysqli->commit(); 

    }else{ 

     $mysqli->rollback(); 

    } 

}else{ 
    $mysqli->rollback(); 
} 

$mysqli->close();