Visualizzazione dei risultati da 1 a 5 su 5

Discussione: dubbio su transazioni

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    97

    dubbio su transazioni

    vorrei sapere se questa transazione è corretta in PHP/MySQL

    1 - inizio la transazione (BEGIN)
    2 - inserisco un record in tb1 (chiave primaria autoincrement)
    3 - memorizzo l'id del record appena inserito con SET @id1=LAST_INSERT_ID();
    4 - inserisco più record in tb2 con chiave esterna pari alla chiave primaria di tb1 utilizzando la variabile @id1
    5 - confermo (COMMIT) se non ci sono stati errori altrimenti annullo (ROLLBACK);

    ci sono problemi in caso di accessi concorrenti?

    se user1 inizia la transazione, user2 può iniziarene un'altra prima che quella di user1 sia terminata?

    se si il mio dubbio è il seguente:
    se user1 esegue i passi 1 e 2 e la chiave primaria di tb1 risulta essere N, poi se user2 esegue a sua volta i passi 1 e 2 prima che la transazione di user 1 sia terminata, la chiave primaria del record di user2 sarà N+1?
    e se poi la transazione di user1 non va a buon fine e quella di user2 si, la chiave primaria del record di user2 sarà sempre N+1?

    Spero di essere stato chiaro.
    Grazie!!!

  2. #2
    Dal manuale MySQL:

    codice:
    ...
    Suppose that there are two transactions running, each inserting rows into a table with an AUTO_INCREMENT column. 
    One transaction is using an INSERT ... SELECT statement that inserts 1000 rows, 
    and another is using a simple INSERT statement that inserts one row:
    
    Tx1: INSERT INTO t1 (c2) SELECT 1000 rows from another table ...
    Tx2: INSERT INTO t1 (c2) VALUES ('xxx');
    
    InnoDB cannot tell in advance how many rows will be retrieved from the SELECT 
    in the INSERT statement in Tx1, and it assigns the auto-increment values one at a time 
    as the statement proceeds. 
    With a table-level lock, held to the end of the statement, only one INSERT statement 
    referring to table t1 can execute at a time, and the generation of auto-increment 
    numbers by different statements is not interleaved. 
    The auto-increment value generated by the Tx1 INSERT ... SELECT statement 
    will be consecutive, and the (single) auto-increment value used by the INSERT 
    statement in Tx2 will either be smaller or larger than all those used for Tx1, 
    depending on which statement executes first. 
    ...
    Non dovrebbero esserci problemi se utilizzi transazioni in quanto un eventuale accesso contemporaneo genererà comunque in ID (auto_increment) differente (superiore o inveriore) a seconda dell'ordine di esecuzione delle transazioni.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    97
    OK.. grazie mille. Speriamo bene

  4. #4
    In fondo ti basta fare qualche piccola prova utilizzando ad esempio la funzione sleep() in modo da rallentare l'esecuzione dello script e, nel frattempo, collegarti con un altro browser e provare ad effettuare un altro inserimento e vedere cosa succede sul DB.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    97
    Grazie.. credo che farò qualche prova.

    Un'altra domanda se possibile.

    Avrei bisogno di gestire l'annullamento di un record.. mi spiego meglio.

    ho una tabella del tipo IDANAG|IDPROF dove IDANAG è chiave esterna riferita alla tabella delle anagrafiche e IDPROF è chiave esterna alla tabella delle professioni, così ogni anagrafica può avere 0 o più professioni.

    la domanda è questa:
    se volessi annullare una professione, quindi NON consentire l'inserimento di una nuova anagrafica con quella professione, ma mantenere le vecchie associazioni anagrafica-professione,
    devo farlo necessariamente da codice utilizzando un flag di annullamento nella tabella delle professioni? C'è una pratica migliore?

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.