Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21

    [mysql] Transazioni in funzioni/procedure

    Se io ho una funzione (mysql, non php) o una stored procedure nelle quali ho 2 delete in 2 tabelle diverse di fila (oppure un delete in una tabella seguito da un insert in un altra), so che dovrei usare delle transazioni perché se per qualche motivo fallisse la seconda query, avrei il DB in uno stato sbagliato, ma come protrei fare? Che controlli dovrei fare per vedere se committare o fare il rollback nella funzione/stored procedure? Ho cercato in giro, ma non trovo nulla

  2. #2
    Ciao,
    praticamente subito all'inzio della stored procedure devi dichiarare gli exit handler per decidere cosa fare quando ci sono degli errori nella transazione..


    codice:
    create procedure pippo()
    begin
    #se una select non trova il dato fai rollback
    declare exit handler for not found rollback; 
    
    #se si verifica un'eccezione fai rollback
    declare exit handler for sqlexception rollback; 
    
    #ecc. ecc.
    
    
    start transaction
    
    (...qui fai le tue insert, delete e altre istruzioni DDL ...)
    
    commit;
    
    
    end


    riferimenti : http://dev.mysql.com/doc/refman/5.5/...e-handler.html

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    codice:
    create procedure pippo()
    begin
    
    start transaction
    (...qui fai le tue insert, delete e altre istruzioni DDL ...)
    commit;
    
    end
    E se io non li mettessi ma facessi solamente così cosa succederebbe?

  4. #4
    Originariamente inviato da sawada91


    E se io non li mettessi ma facessi solamente così cosa succederebbe?
    se non metti gli handler mysql applica della azioni di default a seconda dell'errore...
    però non so quali, nel link che ti ho dato dovrebbe esserci spiegato (quasi) tutto

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Capito. Ultima cosa. Perché nei trigger non posso usare le transazioni? Le conta già come una soltanto sia quelle dentro sia quella del BEFORE/AFTER?

  6. #6
    Originariamente inviato da sawada91
    Capito. Ultima cosa. Perché nei trigger non posso usare le transazioni? Le conta già come una soltanto sia quelle dentro sia quella del BEFORE/AFTER?
    Premesso che non ho idea di come siano implementati i trigger in MySQL (che per altro è solo della versione 5.0 che esistono) , posso però dirti che, a quanto ne so, i trigger dei vari database non permettono mai operazioni di commit e di rollback (quindi escludono l'uso di transazioni al loro interno, se vuoi), ...questo per non creare incosistenze in dati che magari stanno venendo modificati dal trigger stesso...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Quindi se ho più query da fare non posso usare transazioni nei trigger in nessun modo?

  8. #8
    Originariamente inviato da sawada91
    Quindi se ho più query da fare non posso usare transazioni nei trigger in nessun modo?
    per quanto riguarda MySQL non saprei dirti perché non mi sono mai posto il problema. Ma al 99% non c'è nessun modo per usare le transazioni nei trigger...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Comunque giusto per sicurezza, io chiedo. Se ho una procedura del genere:
    codice:
    delimiter $ 
    CREATE PROCEDURE Deletetopic (TopicId INT) 
    BEGIN 
    START TRANSACTION; 
    DELETE m.* FROM messages m NATURAL JOIN publicmessages p WHERE p.idtopic=TopicId; 
    DELETE FROM topics WHERE idtopic=TopicId; 
    COMMIT; 
    END; $ 
    delimiter ;
    La transazione ci sta? O non serve? Io più che per gli accessi concorrenti, l'ho usata per il fatto che se la seconda query fallisce, mi ritrovo il database in uno stato errato.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2012
    Messaggi
    21
    Nessuno?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.