oci_rollback

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

oci_rollback - 미해결 ​​데이터베이스 트랜잭션을 롤백합니다.


설명

oci_rollback(resource $connection): bool

Oracle connection에 대해 커밋되지 않은 모든 변경 사항을 되돌리고 트랜잭션을 종료합니다. 보유하고 있는 모든 잠금을 해제합니다. 모든 Oracle SAVEPOINTS가 지워집니다.

데이터를 변경하는 첫 번째 SQL 문이 OCI_NO_AUTO_COMMIT 플래그를 사용하여 oci_execute()로 실행될 때 트랜잭션이 시작됩니다. 다른 명령문에 의한 추가 데이터 변경은 동일한 트랜잭션의 일부가 됩니다. 트랜잭션의 데이터 변경 사항은 트랜잭션이 커밋되거나 롤백될 때까지 일시적입니다. 데이터베이스의 다른 사용자는 커밋될 때까지 변경 사항을 볼 수 없습니다.

데이터를 삽입하거나 업데이트할 때 관계형 데이터 일관성과 성능상의 이유로 트랜잭션을 사용하는 것이 좋습니다.


매개변수

connection
oci_connect(), oci_pconnect() 또는 oci_new_connect()에 의해 반환된 Oracle 연결 식별자입니다.

반환 값

성공하면 true를, 실패하면 false를 반환합니다.


Examples

예제 #1 oci_rollback() 예제

                  
<?php

// Insert into several tables, rolling back the changes if an error occurs

$conn = oci_connect('hr', 'welcome', 'localhost/XE');

$stid = oci_parse($conn, "INSERT INTO mysalary (id, name) VALUES (1, 'Chris')");

// The OCI_NO_AUTO_COMMIT flag tells Oracle not to commit the INSERT immediately
// Use OCI_DEFAULT as the flag for PHP <= 5.3.1.  The two flags are equivalent
$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);  // rollback changes to both tables
    trigger_error(htmlentities($e['message']), E_USER_ERROR);
}

// Commit the changes to both tables
$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);

// Create the savepoint
$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);

// Use an explicit SQL statement to rollback to the savepoint
$stid = oci_parse($conn, 'ROLLBACK TO SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);

oci_commit($conn);  // mytab now has id of 1111
?>
                     
                   

노트

메모:

연결을 닫거나 스크립트가 종료될 때 트랜잭션은 자동으로 롤백됩니다. 트랜잭션을 커밋하려면 oci_commit()을 명시적으로 호출해야 합니다.

명시적으로 또는 기본적으로 OCI_COMMIT_ON_SUCCESS 모드를 사용하는 oci_execute()를 호출하면 커밋되지 않은 이전 트랜잭션이 커밋됩니다.

CREATE 또는 DROP과 같은 모든 Oracle DDL 문은 커밋되지 않은 트랜잭션을 자동으로 커밋합니다.


기타