(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_rollback — Reverte a transação pendente do banco de dados
Reverte todas as alterações não confirmadas para a conexão
do Oracle definida em connection
e encerra a transação.
Libera todos os bloqueios mantidos. Todos os SAVEPOINTS
do Oracle
são apagados.
Uma transação começa quando a primeira instrução SQL que altera os dados
é executada com oci_execute() usando
a opção OCI_NO_AUTO_COMMIT
. Outras alterações nos dados
feitas por outras instruções tornam-se parte da mesma
transação. As alterações nos dados feitas em uma transação são temporárias
até que a transação seja confirmada ou revertida. Outros usuários
do banco de dados não verão as alterações até que sejam confirmadas.
Ao inserir ou atualizar dados, é recomendado o uso de transações para consistência de dados relacionais e por questões de desempenho.
connection
Um identificador de conexão Oracle, retornado por oci_connect(), oci_pconnect() ou oci_new_connect().
Exemplo #1 Exemplo de oci_rollback()
<?php
// Insere em várias tabelas, revertendo as alterações se ocorrer um erro
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
$stid = oci_parse($conn, "INSERT INTO mysalary (id, name) VALUES (1, 'Chris')");
// O sinalizador OCI_NO_AUTO_COMMIT informa ao Oracle para não confirmar o INSERT imediatamente
$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); // reverte alterações em ambas as tabelas
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
// Confirma as alterações em ambas as tabelas
$r = oci_commit($conn);
if (!r) {
$e = oci_error($conn);
trigger_error(htmlentities($e['message']), E_USER_ERROR);
}
?>
Exemplo #2 Exemplo de reversão para um SAVEPOINT
<?php
$stid = oci_parse($conn, 'UPDATE mytab SET id = 1111');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
// Cria o ponto de salvamento
$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);
// Usa uma instrução SQL explícita para retornar ao ponto de salvamento
$stid = oci_parse($conn, 'ROLLBACK TO SAVEPOINT mysavepoint');
oci_execute($stid, OCI_NO_AUTO_COMMIT);
oci_commit($conn); // mytab agora tem o ID de 1111
?>
Nota:
As transações são revertidas automaticamente quando a conexão é fechada ou quando o script termina, o que ocorrer primeiro. Deve ser chamada explicitamente a função oci_commit() para confirmar a transação.
Qualquer chamada a oci_execute() que utilize o modo
OCI_COMMIT_ON_SUCCESS
explicitamente ou por padrão confirmará qualquer transação anterior não confirmada.Qualquer instrução DDL do Oracle, como
CREATE
ouDROP
, confirmará automaticamente qualquer transação não confirmada.