(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_rollback — 回復未完成的資料庫交易
還原 Oracle 連線
的所有未提交變更,並結束交易。它會釋放所有持有的鎖定。所有 Oracle SAVEPOINTS
都將被清除。
當第一個更改資料的 SQL 陳述式使用 oci_execute() 並搭配 OCI_NO_AUTO_COMMIT
旗標執行時,交易便開始。其他陳述式所做的進一步資料更改將成為同一交易的一部分。在交易中進行的資料更改,直到交易提交或回復為止都是暫時的。其他資料庫使用者在資料更改提交之前,將不會看到這些更改。
插入或更新資料時,建議使用交易來確保關聯式資料的一致性並提升效能。
範例 #1 oci_rollback() 範例
<?php
// 插入多個資料表,如果發生錯誤則回復變更
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
$stid = oci_parse($conn, "INSERT INTO mysalary (id, name) VALUES (1, 'Chris')");
// OCI_NO_AUTO_COMMIT 旗標告知 Oracle 不要立即提交 INSERT
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {
$e = oci_error($stid);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
$stid = oci_parse($conn, 'INSERT INTO myschedule (startday) VALUES (12)');
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
if (!$r) {
$e = oci_error($stid);
oci_rollback($conn); // 回復兩個資料表的變更
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
// 提交兩個資料表的變更
$r = oci_commit($conn);
if (!$r) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
?>
範例 #2 回復到 SAVEPOINT
的範例
<?php
$stid = oci_parse($conn, 'UPDATE mytab SET id = 1111');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
// 建立存儲點
$stid = oci_parse($conn, 'SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
$stid = oci_parse($conn, 'UPDATE mytab SET id = 2222');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
// 使用明確的 SQL 陳述式回復到存儲點
$stid = oci_parse($conn, 'ROLLBACK TO SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
oci_commit($conn); // mytab 現在的 id 為 1111
?>
備註:
當您關閉連線或腳本結束時(以先發生的事件為準),交易會自動回復。您需要明確呼叫 oci_commit() 函式來提交交易。
任何使用
OCI_COMMIT_ON_SUCCESS
模式(明確或預設)呼叫 oci_execute() 函式都會提交任何先前未提交的交易。任何 Oracle DDL 陳述式(例如
CREATE
或DROP
)都會自動提交任何未提交的交易。