Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    56

    LAST_INSERT_ID() se accesso multiplo?

    Salve, mi sono fatto un giro in rete e sul forum, ma non ho soddisfatto il mio dubbio.
    in una tabella dove anno accesso molte possibili utenze devo inserire molti record.
    La tabella ha un autoincrementale e in fase di inserimento devo conoscere l'id del record inserito per legarlo in un'altra tabella.
    Poichè tale inserimento può avvenire nello stesso istante da più utenti rischio di fare un inserimento e mediante la funzione LAST_INSERT_ID() ricevere l'id di un inserimento successivo da parte di un'altro utente. Come posso tutelarmi.
    Ho pensato ache facendo una store procedure del genere:
    codice:
    CREATE  PROCEDURE `City_Insert`(in p_in_city varchar(50), in p_in_country_id int)
    BEGIN
    	insert into city (city,country_id) values( p_in_city, p_in_country_id);
    	select LAST_INSERT_ID();
    END
    dovrei tutelarmi perchè dovrebbe bloccare l'accesso alla tabella finche non ha finito, quindi tra quando inserisco e quando leggo nessuno si può intromettere.
    Ma non ne sono sicuro perchè ho poca esperienza, non so se devo aggiungere codice a una store procedure per dagli l'accesso unico alla tabella fino a che non finisce. Voi che dite?

  2. #2
    Da quello che ricordo, LAST_INSERT_ID() dovrebbe restituire l'ultimo autoincrement creato all'interno della stessa sessione/connessione SQL.

    Questo significa che degli utenti concorrenti non dovrebbero modificare l'ID restituito in un'altra sessione.

    Per verificare la cosa puoi provare due script come i seguenti:

    Codice PHP:
    <?php
    // test_a.php
    $link mysql_connect('localhost''root''');

    mysql_select_db('test');

    mysql_query("INSERT INTO test (test) VALUES ('test')");

    sleep(10); // favorisci la concorrenza

    printf("Last inserted record has id %d\n"mysql_insert_id());
    ?>
    Codice PHP:
    <?php
    // test_b.php
    $link mysql_connect('localhost''root''');

    mysql_select_db('test');

    mysql_query("INSERT INTO test (test) VALUES ('test')");
    mysql_query("INSERT INTO test (test) VALUES ('test')");
    mysql_query("INSERT INTO test (test) VALUES ('test')");
    mysql_query("INSERT INTO test (test) VALUES ('test')");
    mysql_query("INSERT INTO test (test) VALUES ('test')");
    mysql_query("INSERT INTO test (test) VALUES ('test')");

    printf("Last inserted record has id %d\n"mysql_insert_id());
    ?>
    Richiamando test_a.php ed, immediatamente dopo, test_b.php dovresti scoprire che test_a.php restituisce l'ID generato dal suo INSERT e non dall'ultima query di test_b.php

  3. #3
    Eventualmente puoi passare $link come parametro

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    56
    pultroppo non lavoro con php, ma con asp quindi non poso fare quello che mi consigliate, ma visto che lo avete già fattto voi mi fido.
    la question però è se facendo tutte le queri in una store procedure siamo più sicuri di una sicurezza basata su "all'interno della stessa sessione/connessione SQL."
    io credo di si, ma ci vorrebbe un esperto di mysql :master:

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.