2024 年 PHP 日本会议

oci_rollback

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

oci_rollback回滚未提交的数据库事务

描述

oci_rollback(资源 $connection): 布尔值

回滚 Oracle connection 中所有未提交的更改并结束事务。它释放所有持有的锁。所有 Oracle SAVEPOINTS 都将被清除。

当使用OCI_NO_AUTO_COMMIT标志通过oci_execute()执行第一个更改数据的SQL语句时,事务开始。其他语句进行的进一步数据更改将成为同一事务的一部分。在事务中进行的数据更改是临时的,直到事务提交或回滚。数据库的其他用户在数据提交之前将看不到这些更改。

在插入或更新数据时,建议使用事务来确保关系数据的一致性和提高性能。

参数

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