請注意,呼叫 mysqli::commit() 並不會自動將 mysqli::autocommit() 設回 'true'。
這表示在 mysqli::commit() 之後執行的任何查詢都會在您的腳本結束時回滾。
(PHP 5, PHP 7, PHP 8)
mysqli::commit -- mysqli_commit — 提交目前的事務
物件導向風格
程序風格
提交資料庫連線的當前事務。
mysql
僅限程序式風格:由 mysqli_connect() 或 mysqli_init() 返回的 mysqli 物件。
flags
MYSQLI_TRANS_COR_*
常數的位元遮罩。
name
如果提供,則執行 COMMIT/*name*/
。
如果啟用了 mysqli 錯誤報告 (MYSQLI_REPORT_ERROR
) 且請求的操作失敗,則會產生警告。此外,如果模式設定為 MYSQLI_REPORT_STRICT
,則會改為拋出 mysqli_sql_exception。
版本 | 說明 |
---|---|
8.0.0 |
name 現在可以為 null。 |
請參閱 mysqli::begin_transaction() 範例。
注意:
此函數不適用於非事務性表格類型(例如 MyISAM 或 ISAM)。
請注意,呼叫 mysqli::commit() 並不會自動將 mysqli::autocommit() 設回 'true'。
這表示在 mysqli::commit() 之後執行的任何查詢都會在您的腳本結束時回滾。
我從不建議使用只有一個值變體的 ?,例如:$var = expression ? $var : other_value 或 $var = expression ? null : other_value,而且 php 支援例外處理,所以請使用它 :)
這是我對 lorenzo 貼文的看法
<?php
//合併變體
$mysqli->autocommit(FALSE);
try{
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") or throw new Exception('錯誤!');
// 或者我們可以使用
if( !$mysqli->query("INSERT INTO myCity (id) VALUES (200)"){
throw new Exception('錯誤!');
}
}catch( Exception $e ){
$mysqli->rollback();
}
$mysqli->commit();
?>
這是一個用來解釋 rollback 和 commit 函式功能的例子。
假設您想要確保所有查詢都必須在將資料寫入資料庫之前沒有錯誤地執行。
程式碼如下:
<?php
$all_query_ok=true; // 我們的控制變數
//我們執行 4 次插入,最後一次會產生錯誤
//如果至少有一個查詢返回錯誤,我們就更改控制變數
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (200)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (300)") ? null : $all_query_ok=false;
$mysqli->query("INSERT INTO myCity (id) VALUES (100)") ? null : $all_query_ok=false; //重複的主鍵值
//現在讓我們測試我們的控制變數
$all_query_ok ? $mysqli->commit() : $mysqli->rollback();
$mysqli->close();
?>
希望對您有所幫助!
以下說明 Flags 參數及其含義
MYSQLI_TRANS_COR_AND_CHAIN
將 "AND CHAIN" 附加到 mysqli_commit 或 mysqli_rollback。
MYSQLI_TRANS_COR_AND_NO_CHAIN
將 "AND NO CHAIN" 附加到 mysqli_commit 或 mysqli_rollback。
MYSQLI_TRANS_COR_RELEASE
將 "RELEASE" 附加到 mysqli_commit 或 mysqli_rollback。
MYSQLI_TRANS_COR_NO_RELEASE
將 "NO RELEASE" 附加到 mysqli_commit 或 mysqli_rollback。
說明這些選項
AND CHAIN 子句會在目前的交易結束後立即開始新的交易,且新的交易與剛結束的交易具有相同的隔離層級。
RELEASE 子句會在終止目前事務後,讓伺服器斷開目前的客戶端連線。
當您有很多事務要執行時,例如您正在迴圈中將項目插入資料庫,最好使用 mysqli_commit 進行這類處理,因為它只會存取資料庫一次。
//錯誤的做法
範例 1
$con = mysqli_connect("host", "username", "password", "database") or die("無法建立與資料庫的連線");
$users = ["chris", "james", "peter", "mark", "joe", "alice", "bob"]
for($i=0; $i<count($users); $i++){
$user= $users[$i];
$query = mysqli_query($con, "INSERT INTO users (username) VALUES ('$user') ");
}
//正確的做法
範例 2
$con = mysqli_connect("host", "username", "password", "database") or die("無法建立與資料庫的連線");
$users = ["chris", "james", "peter", "mark", "joe", "alice", "bob"]
//關閉自動提交
mysqli_autocommit($con, FALSE)
//執行一些事務
for($i=0; $i<count($users); $i++){
$user= $users[$i];
$query = mysqli_query($con, "INSERT INTO users (username) VALUES ('$user') ");
}
//一次性存取資料庫
mysqli_commit($con)
如同範例 1,由於列表中有 7 個項目,這表示會對資料庫存取 7 次,這確實會影響效能。但使用範例 2,由於我們已經關閉了自動提交,這表示事務將會排隊,直到我們明確呼叫 mysqli_commit($con)