(PHP 5, PHP 7, PECL OCI8 >= 1.1.0)
oci_rollback — 未解決のデータベーストランザクションをロールバックする
$connection
)
Oracle 接続 connection
について、
コミットされていないすべての変更を取り消します。
取得しているロックはすべて解放します。また、すべての Oracle SAVEPOINTS
を削除します。
トランザクションが始まるのは、データを変更する最初の SQL 文が
OCI_NO_AUTO_COMMIT
フラグつきの
oci_execute() で実行されたときです。
それ以降、他の文で実行されたデータの変更は、同じトランザクションの一部となります。
トランザクション内でのデータの変更は、
コミットあるいはロールバックされるまでは一時的なものとなります。
トランザクションがコミットされるまで、
データベースの他のユーザーはその変更を見ることができません。
データを追加したり更新したりする場合にはトランザクションを使うことを推奨します。 これは、データの一貫性やパフォーマンスを考慮したものです。
成功した場合に 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 フラグで、INSERT 直後にコミットしないよう Oracle に指示します。
// PHP <= 5.3.1 では OCI_DEFAULT を使います。これらふたつのフラグは同じ意味です
$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 など) を実行すると、 その時点までの未確定のトランザクションをすべてコミットします。