MySQL : transactie binnen een opgeslagen procedure

De basisstructuur van mijn opgeslagen procedure is,

BEGIN

    .. Declare statements ..

    START TRANSACTION;

        .. Query 1 ..
        .. Query 2 ..
        .. Query 3 ..

    COMMIT;

END

MySQL versie: 5.1.61-0ubuntu0.11.10.1-log

Momenteel als ‘query 2′ mislukt, resultaat van query 1’ is gepleegd.

  • Hoe kan ik het terugdraaien van de transactie als een van de query mislukt?
  • Merk ook op dat er een school van denken met mensen die geloven transacties genoemd mag worden buiten het bereik van een opgeslagen procedure en dat de procedures/functies moet in staat zijn om volledig inclusief roeping transactie.
  • Ook stackoverflow.com/q/18817148/632951

 

3 Replies
  1. 59

    Een kijkje nemen op http://dev.mysql.com/doc/refman/5.0/en/declare-handler.html

    In principe verklaart u fout van de handler die een rollback

    START TRANSACTION;
    
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
        BEGIN
            ROLLBACK;
            EXIT PROCEDURE;
        END;
    COMMIT;
    • Bedankt voor uw antwoord. Ik voegde de volgende 3 handlers en het werkt..
    • VERKLAREN EXIT-HANDLER VOOR NIET GEVONDEN TERUGDRAAIEN;
    • VERKLAREN EXIT-HANDLER VOOR SQLWARNING TERUGDRAAIEN;
    • VERKLAREN EXIT-HANDLER VOOR SQLEXCEPTION TERUGDRAAIEN;
    • Kapasi, geweldig, gewoon om op te merken, ik denk dat alleen de laatste is echt nodig.
    • VERKLAREN mag alleen worden gebruikt na een BEGIN-en verliesrekening

  2. 32

    Gewoon een alternatief voor de code door rkosegi,

    BEGIN
    
        .. Declare statements ..
    
        DECLARE EXIT HANDLER FOR SQLEXCEPTION 
        BEGIN
              .. set any flags etc  eg. SET @flag = 0; ..
              ROLLBACK;
        END;
    
        START TRANSACTION;
    
            .. Query 1 ..
            .. Query 2 ..
            .. Query 3 ..
    
        COMMIT;
        .. eg. SET @flag = 1; ..
    
    END
  3. 4

    Hier is een voorbeeld van een transactie die zal terugdraaien op fout en de terugkeer van de foutcode.

    DELIMITER $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `SP_CREATE_SERVER_USER`(
        IN P_server_id VARCHAR(100),
        IN P_db_user_pw_creds VARCHAR(32),
        IN p_premium_status_name VARCHAR(100),
        IN P_premium_status_limit INT,
        IN P_user_tag VARCHAR(255),
        IN P_first_name VARCHAR(50),
        IN P_last_name VARCHAR(50)
    )
    BEGIN
    
        DECLARE errno INT;
        DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
        GET CURRENT DIAGNOSTICS CONDITION 1 errno = MYSQL_ERRNO;
        SELECT errno AS MYSQL_ERROR;
        ROLLBACK;
        END;
    
        START TRANSACTION;
    
        INSERT INTO server_users(server_id, db_user_pw_creds, premium_status_name, premium_status_limit)
        VALUES(P_server_id, P_db_user_pw_creds, P_premium_status_name, P_premium_status_limit);
    
        INSERT INTO client_users(user_id, server_id, user_tag, first_name, last_name, lat, lng)
        VALUES(P_server_id, P_server_id, P_user_tag, P_first_name, P_last_name, 0, 0);
    
        COMMIT WORK;
    
    END$$
    DELIMITER ;

    Dit is in de veronderstelling dat auto-commit is ingesteld op 0.
    Hoop dat dit helpt.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *