PHP Conference Japan 2024

oci_rollback

(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)

oci_rollback回復未完成的資料庫交易

說明

oci_rollback(資源 $connection): 布林值

還原 Oracle 連線的所有未提交變更,並結束交易。它會釋放所有持有的鎖定。所有 Oracle SAVEPOINTS 都將被清除。

當第一個更改資料的 SQL 陳述式使用 oci_execute() 並搭配 OCI_NO_AUTO_COMMIT 旗標執行時,交易便開始。其他陳述式所做的進一步資料更改將成為同一交易的一部分。在交易中進行的資料更改,直到交易提交或回復為止都是暫時的。其他資料庫使用者在資料更改提交之前,將不會看到這些更改。

插入或更新資料時,建議使用交易來確保關聯式資料的一致性並提升效能。

參數

連線 (connection)

一個 Oracle 連線識別碼,由 oci_connect()oci_pconnect()oci_new_connect() 傳回。

傳回值

成功時傳回 true,失敗時傳回 false

範例

範例 #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 陳述式(例如 CREATEDROP)都會自動提交任何未提交的交易。

另請參閱

新增註記

使用者貢獻的註記

此頁面沒有使用者貢獻的註記。
To Top