fsf 0 Denunciar post Postado Março 26, 2007 Pessoal,Estou tentando usar o controle de transação no postgree mas não estou conseguindo!! $query = "roolback"; $result = pg_query($query); Compartilhar este post Link para o post Compartilhar em outros sites
marceloy 0 Denunciar post Postado Março 26, 2007 $query = "rollback"; Compartilhar este post Link para o post Compartilhar em outros sites
fsf 0 Denunciar post Postado Março 26, 2007 Marceloy, To tentando fazer o controle de transação de um carrinho Inserindo dados em duas tabelas! Mas, não estou conseguindo usar o rollback direito!!! Por exemplo se acintecer algum erro na inserção de dados da segunda tabela os dados inseridos na primeira não devem existir!! Mas não estou conseguindo fazer isto!! O codigo: function insert_order($data,$unidade,$retirado,$matricula){ // extract order_details out as variables // extract($order_details); //$date = date('Y-m-d'); $hora = date("H:i"); $date = data_mysql($data); $usuario = $_SESSION['usuario']; $query = "insert into tb_saida_secretaria (retiradopor,matricula, horacadastro,datasaida ,codunidade,responsavelcadastro) values( '$retirado', '$matricula', '$hora','$date', '$unidade', '$usuario')"; ///echo $query; $result = pg_query($query); if (!$result){ $query = "rollback"; //echo $query; $result = pg_query($query); return false; } $query = "select max(codsaida) as codigo from tb_saida_secretaria;"; $result = pg_query($query); if (!$result){ /$query = "rollback"; //echo $query; $result = pg_query($query); return false; }else{ $orderid = pg_fetch_array($result); } // insert each book foreach($_SESSION['cart'] as $cod=> $quantity) { $detail = get_prod_details($cod); $query = "select produto.descricao,estoque.quantidade from tb_estoque_secretaria estoque, tb_produto produto where estoque.codproduto = produto.codproduto and estoque.codproduto =".$orderid['codigo']; $result = pg_query($query); $quant = pg_fetch_array($result); if($quant['quantidade'] < $quantity){ echo '<script> alert("\n A quantidade do produto é insuficiente!") </script>'; $query = "rollback"; $result = pg_query($query); return false; } $query = "insert into tb_item_saida_secretaria(codsaida,codproduto,quantidade) values ('".$orderid['codigo']."', '$cod', $quantity)"; //echo $query; $result = pg_query($query); if(!$result){ $query = "rollback"; //echo $query; $result = pg_query($query); return false; } } return $orderid;}?> Compartilhar este post Link para o post Compartilhar em outros sites
marceloy 0 Denunciar post Postado Março 27, 2007 fsf, não li a fundo seu código, mas entendi seu procedimento. Acho que está esquecendo de usar as sintaxes SQL BEGIN e COMMIT. Recomendo a leitura do material de Postgree no site php.net (Em especial o Exemplo de COMMIT). Acredito que a função pg_transaction_status também o ajude. Compartilhar este post Link para o post Compartilhar em outros sites
fsf 0 Denunciar post Postado Março 27, 2007 Marceloy, Tava faltando o begin mesmo!! Agora o codigo ficou assim: { // extract order_details out as variables // extract($order_details); //$date = date('Y-m-d'); $query = "BEGIN"; //echo $query; $result = pg_query($query); $hora = date("H:i"); $date = data_mysql($data); $usuario = $_SESSION['usuario']; $query = "insert into tb_saida_secretaria (retiradopor,matricula, horacadastro,datasaida ,codunidade,responsavelcadastro) values( '$retirado', '$matricula', '$hora','$date', '$unidade', '$usuario')"; ///echo $query; $result = pg_query($query); if (!$result){ $query = "rollback"; //echo $query; $result = pg_query($query); return false; } $query = "select max(codsaida) as codigo from tb_saida_secretaria;"; $result = pg_query($query); if (!$result){ $query = "rollback"; //echo $query; $result = pg_query($query); return false; }else{ $orderid = pg_fetch_array($result); } // insert each book foreach($_SESSION['cart'] as $isbn => $quantity) { $detail = get_book_details($isbn); $query = "select produto.descricao,estoque.quantidade from tb_estoque_secretaria estoque, tb_produto produto where estoque.codproduto = produto.codproduto and estoque.codproduto =".$isbn; //echo $query; $resultado = pg_query($query); $dados = pg_fetch_array($resultado); //while ($dados=pg_fetch_array($resultado)) { $teste = $dados["descricao"]; // } if($dados["quantidade"] < $quantity){ // echo "<script>alert('A quantidade do produto $teste no estoque é insuficiente!'); print "<script>alert('A quantidade do produto $teste no estoque é insuficiente!');</script>"; $query = "rollback"; $result = pg_query($query); return false; } $query = "insert into tb_item_saida_secretaria(codsaida,codproduto,quantidade) values ('".$orderid['codigo']."', '$isbn', $quantity)"; //echo $query; $result = pg_query($query); $query = "update tb_estoque_secretaria set quantidade = quantidade - $quantity where codproduto = $isbn "; $result = pg_query($query); if(!$result){ $query = "rollback"; //echo $query; $result = pg_query($query); return false; } } $query = "COMMIT "; $result = pg_query($query); pg_close($connect); return $orderid;} Compartilhar este post Link para o post Compartilhar em outros sites
marceloy 0 Denunciar post Postado Março 27, 2007 Mas agora deu certo ?? Nunca trabalhei com Postgree mas pela função que te mostrei acho que poderia fazer algo da forma: // Iniciar transação.$query = "BEGIN";// Realizar normalmente as iterações com a base.......// Verificar se houve falhas e proceder por ROLLBACK ou COMMIT.if(pg_transaction_status($idConexao) == PGSQL_TRANSACTION_IDLE) $query = "COMMIT";else $query = "ROLLBACK"; Claro que só dei uma idéia. É mais ou menos dessa forma que faço no MySQL. A idéia é: 1. Definir o inicio da transação. 2. Realizar operações. 3. Ao final, definir se as operações se concretizam ou se retrocedem. Compartilhar este post Link para o post Compartilhar em outros sites