Cómo detectar una reversión en MySQL procedimiento almacenado?

Estoy tratando de encontrar una manera de detectar la ocurrencia de la reversión en una base de datos MySQL procedimiento almacenado de manera que podía manejar la situación, de acuerdo a un script de PHP, pero hasta ahora no puedo encontrar ninguna solución.

Mi procedimiento almacenado se parece a esto:

     delimiter |
      create procedure multi_inserts(
      IN var1 int(11),
           .
           .
           .
      IN string1 text
      )
      BEGIN

      declare exit handler for sqlexception rollback;
      declare exit handler for sqlwarning rollback;

      START TRANSACTION;
      insert into table1(a,b,c,d) values(var1,var2,var3,var4);
      insert into table2(e,f,g) values(var5,var6,string1);
      COMMIT;

      END
      delimiter ;

Hice una reversión de la prueba en este procedimiento y se hicieron rollback pero no tengo false.
Quiero que mi procedimiento almacenado para lanzar algún tipo de mensaje de error si el error en la transacción, por lo que podía manejar así:

    $result = mysql_query($procedure); 
    if(!$result) 
    {
      //rollback occured do something   
    }

Hay una forma de detectar la reversión en MySQL?
Me estoy perdiendo algo?
Cualquier respuesta será bienvenida.
Gracias por la lectura.


Gracias a tus consejos he arreglado este problema. Esto es lo que hice:

Procedimiento Almacenado

     delimiter |
      create procedure multi_inserts(
      IN var1 int(11),
           .
           .
           .
      IN string1 text
      )
      BEGIN

      declare exit handler for sqlexception sqlwarning
      BEGIN
      rollback;
      select -1;
      END;

      START TRANSACTION;
      insert into table1(a,b,c,d) values(var1,var2,var3,var4);
      insert into table2(e,f,g) values(var5,var6,string1);
      COMMIT;

      END
      delimiter ;

Si puedo usar variables en lugar de seleccionar -1, me da este error:

OUT o INOUT argumento no es un
variable o NUEVOS pseudo-variable en
ANTES de desencadenar

No sé qué hice mal, pero yo no podía solucionar este problema.

Script PHP

$result=mysqli_query($con,$procedure);
if(is_object($result))
{
//rollback happened do something!
}

Si el SP es el éxito de la lanza de verdad.

InformationsquelleAutor Kou | 2010-11-02

4 Kommentare

  1. 7

    Puede añadir una salida param y, a continuación, establecer el valor que usted desea en su salida de los controladores.

    He aquí un ejemplo de uso de su proc:

    delimiter $$
      create procedure multi_inserts(
      IN var1 int(11),
           .
           .
           .
      IN string1 text,
      OUT p_return_code tinyint unsigned
      )
      BEGIN
    
      DECLARE exit handler for sqlexception
      BEGIN
        -- ERROR
        set p_return_code = 1;
        rollback;
      END;
    
      DECLARE exit handler for sqlwarning
      BEGIN
        -- WARNING
        set p_return_code = 2;
        rollback;
      END;
    
      START TRANSACTION;
      insert into table1(a,b,c,d) values(var1,var2,var3,var4);
      insert into table2(e,f,g) values(var5,var6,string1);
      COMMIT;
    
      -- SUCCESS
      set p_return_code = 0;
    
      END $$
      delimiter ;
    • Gracias por la respuesta detallada. Reescribí mi SP y se trabajó muy bien en la consola de MySQL, sino de php mysql_query no podía manejar el conjunto de resultados, y me dieron un curioso error, así que he actualizado PHP 5.3.3 para mysqli_query. Pensé que esto lo solucione. Lo ingenuo de mí. Después de la actualización tuve otro error en la Pera Auth.php el que estoy usando autenticación y no puedo ver si mysqli_query realmente podría resolver el problema menos que resolver el nuevo problema en primer lugar. El último problema es que no puedo actualizar pera auth por alguna razón. Supongo pera auth es incompatible con 5.3.3. Ahora, ¿qué debo hacer? lo siento, estoy despotricar..
    • Yo no uso PHP. Lo siento.
  2. 0

    Hola a hacer una cosa, el uso de variables de SALIDA y de retorno de 1 o 0 como resultado de la forma SP y hacer lo que quiera en este indicador.

    • Gracias por la respuesta rápida.
  3. 0
    <?php
    try {
        $user='root';
        $pass='';
      $dbh = new PDO('mysql:host=localhost;dbname=dbname', $user, $pass, 
          array(PDO::ATTR_PERSISTENT => true));
      echo "Connected\n";
    } catch (Exception $e) {
      die("Unable to connect: " . $e->getMessage());
    }
    
    try {  
      $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
      $dbh->beginTransaction();
      $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
      $dbh->exec("insert into salarychange (id, amount, changedate) 
          values (23, 50000, NOW())");
      $dbh->commit();
    
    } 
    catch (Exception $e) {
      $dbh->rollBack();
      echo "Failed: " . $e->getMessage();
    }
    ?>
    • por favor, añadir una descripción

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea