(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_rollback — 未解決のデータベーストランザクションをロールバックする
Oracle 接続 connection
について、
コミットされていないすべての変更を取り消します。
取得しているロックはすべて解放します。また、すべての Oracle SAVEPOINTS
を削除します。
トランザクションが始まるのは、データを変更する最初の SQL 文が
OCI_NO_AUTO_COMMIT
フラグつきの
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 フラグで、INSERT 直後にコミットしないよう Oracle に指示します。
$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
など) を実行すると、 その時点までの未確定のトランザクションをすべてコミットします。