+1

Transações com PHP e Microsoft SQL Server

criado por Pablo Vanni em 16/08/2005 10:32am
Ola pessoal! Irei tratar de um recurso bem legal e importante do SQL Server que são as transações, e como utilizar este recurso junto o PHP.

O que é transação?

É um conjunto de procedimentos que é executado num banco de dados, que para o usuário é visto como uma única ação. A integridade de uma transação depende de 4 propriedades, conhecidas como ACID.

- Atomicidade - Uma transação não pode ser executada pela metade, isto é, ou se executa ela por inteiro, ou se retorna para o estado anterior a transação, onde nada foi executado.

- Corretude - Uma transação deve ser efetuada como um programa que preserva a consistência do BD. Sendo assim, ela é de responsabilidade do programador que codifica a transação.

- Consistência - Uma Transação só executa se o estado do Banco de Dados permanecer consistente após seu fim.

- Isolamento - Sua necessidade surge em execuções concorrentes, a intercalação das diversas transações que ocorrem simultaneamente, não podem ser intercaladas de forma a gerar um estado inconsistente.

- Durabilidade - Quando ocorre falha no banco de dados, apos a execução com sucesso de uma transação, a durabilidade garante por algum mecanismo a recuperação das informações perdidas.

Comandos COMMIT e ROLLBACK

Após iniciar uma transação e executar as instruções desejadas esta transação precisa ser finalizada, para finalizá-la utilizamos “COMMIT” se não houver nenhum erro nas instruções SQL, e “ROLLBACK” se pelo menos uma instrução retornou algum erro.

Como utilizar as transações com PHP:

1 – Inicie uma conexão com o bando de dados:
<?php
$dados    = @mssql_connect(“host”, “user”, “senha”) or die (Erro!');
$conectar = @mssql_select_db(“banco”, $dados) or die (‘Erro!');	
?>

2 – Inicie a transação, verifique que “NOME_TRANSACAO” é um nome qualquer que você deve atribuir:
<?php
mssql_query(“BEGIN TRANSACTION NOME_TRANSACAO”);
?>

3 – Inicie uma variável contador:
<?php
$contador = 0;
?>

4 – Execute suas instruções SQL e verifique se não houve erros, caso ocorra contador é incrementado de 1:
<?php
if(!@mssql_query(“Insert Into.....”)) $contador += 1;
if(!@mssql_query(“Update Set.....”)) $contador += 1;
if(!@mssql_query(“Delete From.....”)) $contador += 1;
?>

5 – Verifique valor do contador, COMMIT se contador for 0 ou de ROLLBACK se contador for maior que 0:
<?php
if($contador == 0)
    mssql_query(“COMMIT TRANSACTION NOME_TRANSACAO”);
else
    mssql_query(“ROLLBACK TRANSACTION  NOME_TRANSACAO”);
?>

Pronto nossa transação esta concluída espero que tenham gostado!

Comentários:

Mostrando 1 - 3 de 3 comentários
joannes disse:
depois eu mudei o conteudo da variavel $query para esse:

$query = "INSERT INTO cadastro (pi, descricao, complemento, nota_fiscal,fornecedor,recurso,docente,valor_total,up_arq,loc_anterior,loc_atual,status_anterior,status_atual) VALUES('$pi', '$descricao', '$complemento', '$nota_fiscal','$fornecedor','$recurso','$docente','$valor_total','$loc_anterior','$loc_atual','$status_anterior','$status_atual' ); INSERT INTO movimentação (pi,loc_anterior,loc_atual, status_anterior, status_atual) VALUES ('$pi','$loc_anterior','$loc_atual','$status_anterior','$status_atual')";

mas da eesse erro

Falha durante a Insersao!
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INSERT INTO movimentação (pi,loc_anterior,loc_atual, status_anterior, status_' at line 1
26/01/2017 8:54am (~7 anos atrás)

joannes disse:
Óla boa tarde, estou precisando inserir uns dados digitados pelo usuário em duas tabelas ao mesmo tempo, tipo todos o preenchidos irão para uma tabela A mas para tabela não quero que vai tudo como como na Tabela A, segue parte do código preciso muito terminar isso mas não estou conseguindo.


// definição geral de variáveis:
$table = 'cadastro';
$form = [
'status' => 'Cadastrar',
'submit' => 'Salvar',
'consultar' =>'Consultar',
];
# campos do formulário
$fdata = [
'descricao' => isset($_POST['descricao']) ? $_POST['descricao'] : null,
'pi' => isset($_POST['pi']) ? $_POST['pi'] : null,
'loc_anterior' => isset($_POST['loc_anterior']) ? $_POST['loc_anterior'] : null,
'localizacao' => isset($_POST['localizacao']) ? $_POST['localizacao'] : null,
'complemento' => isset($_POST['complemento']) ? $_POST['complemento'] : null,
'nota_fiscal' => isset($_POST['nota_fiscal']) ? $_POST['nota_fiscal'] : null,
'fornecedor' => isset($_POST['fornecedor']) ? $_POST['fornecedor'] : null,
'recurso' => isset($_POST['recurso']) ? $_POST['recurso'] : null,
'docente' => isset($_POST['docente']) ? $_POST['docente'] : null,
'valor_total' => isset($_POST['valor_total']) ? $_POST['valor_total'] : null,
'status_anterior' => isset($_POST['status_anterior']) ? $_POST['status_anterior'] : null,
'status' => isset($_POST['status']) ? $_POST['status'] : null,
'up_arq' => isset($_POST['up_arq']) ? $_POST['up_arq'] : null,

];



// se algo for postado
if (sizeof($_POST)) {
// trate as variáveis aqui:
// percorre os dados postados
foreach ($_POST as $k => $v) {
// scape special chars
$v = "'" . $sqli->real_escape_string($v) . "'";
// monta um array sanitizado para insert/update
$vars[] = "$k = " . $v;
}

$pi = ($_POST['pi']);
$loc_anterior = ($_POST['loc_anterior']);
$loc_atual = ($_POST['loc_atual']);
$status_anterior = ($_POST['status_anterior']);
$status_atual = ($_POST['status_atual']);

// middle query
$middle_query = $table . ' SET ' . implode(', ', $vars);

// new record case

$query = "INSERT INTO movimentação set pi = '$pi', loc_anterior = '$loc_anterior', loc_atual ='$loc_atual' ,status_anterior ='$status_anterior', status_atual = '$status_atual' "; // aqui vai para tabela Movimentao


$query = 'INSERT INTO ' . $middle_query; // aqui vai para outra tabela mas ele só garva a segunda independente da ordem que eu coloco.

26/01/2017 8:05am (~7 anos atrás)

Roberto disse:
Amigo, como faço para fazer a conexão com o SQL Server 2008?
Faz meses que tento e nada até agora. Usando mssql, srvsql ou pdo... Valeu!
01/11/2013 2:43pm (~10 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)