(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_rollback — 回滚未完成的数据库事务
回滚 Oracle connection
的所有未提交更改并结束事务。它释放所有持有的锁。所有 Oracle SAVEPOINTS
都将被清除。
当使用 OCI_NO_AUTO_COMMIT
标志,第一个更改数据的 SQL 语句通过 oci_execute() 执行时,事务就开始了。其他语句所做的进一步数据更改将成为同一事务的一部分。在事务中进行的数据更改是临时的,直到事务被提交或回滚。数据库的其他用户在提交之前将看不到这些更改。
在插入或更新数据时,建议使用事务来保证关系数据的一致性,并出于性能考虑。
示例 #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_execute(),显式或默认情况下使用
OCI_COMMIT_ON_SUCCESS
模式,都将提交任何先前的未提交事务。任何 Oracle DDL 语句,如
CREATE
或DROP
,都会自动提交任何未提交的事务。