Locking delle tabelle in mysql

di il
10 risposte

Locking delle tabelle in mysql

Buonasera a tutti...premetto sempre che sono agli inizi.
Io ho questa situazione:
I nuovi iscritti vengono memorizzati su db se non sono già presenti, più in la dovrò anche creare delle relazioni tra varie tabelle.
Ora vi chiedo supponendo che in molti si iscrivano contemporaneamente:
1) c'è bisogno di applicare delle locks?
2) Se le applico quelli che vengono bloccati non vengono più memorizzati?
3) In tal caso mi conviene usare una tabella temporanea?
4) Come vanno impostate, mi potreste fare un esempio pratico?
Grazie a tutti

10 Risposte

  • Re: Locking delle tabelle in mysql

    Nulla di tutto questo.
    E' tutto automatico.
  • Re: Locking delle tabelle in mysql

    Tutto di tutto questo.
    Non c'è nulla di automatico.
    Cominciamo col dire che nulla ti vieta di fare una INSERT INTO con una chiave primaria, sicchè inserimenti multipli verranno negati (in realtà avrai un errore mysql, ma il risultato netto è lo stesso, non ti serve controllare prima l'esistenza, se hai un campo discriminante obbligatorio)

    Secondariamente non puoi confidare nelle transazioni, semplicemente perchè... non ci sono (con myisam).
    Inoltre, anche nel caso precedente, avresti il problema del livello ACID da impostare (cosa che tipicamente non puoi fare se non hai la disponibilità del server).

    Volendo invece operare nel modo "giusto", cioè "piglia tutti i lock, rilasciali tutti in un colpo solo", insomma alla vecchia maniera, devi fare così
    LOCK TABLES pippo READ, pluto WRITE, paperino WRITE;
    ... fai qualcosa ...
    UNLOCK TABLES;
    
    Attenzione però:
    1) durante queste operazioni nessun altro potrà leggere o scrivere su pluto e paperino (mentre potranno leggere pippo)
    2) meno roba metti lì, meglio è (proprio perchè stai bloccando il parallelismo)
    3) può capitare che le tabelle siano già LOCK-ate, nel qual caso rischi di morire di fame. Tipicamente si utilizza un timeout a scadenza del quale emetti un qualche genere di errore
  • Re: Locking delle tabelle in mysql

    +m2+ ha scritto:


    Tutto di tutto questo.
    Non c'è nulla di automatico.
    Cominciamo col dire che nulla ti vieta di fare una INSERT INTO con una chiave primaria, sicchè inserimenti multipli verranno negati (in realtà avrai un errore mysql, ma il risultato netto è lo stesso, non ti serve controllare prima l'esistenza, se hai un campo discriminante obbligatorio)

    Secondariamente non puoi confidare nelle transazioni, semplicemente perchè... non ci sono (con myisam).
    Inoltre, anche nel caso precedente, avresti il problema del livello ACID da impostare (cosa che tipicamente non puoi fare se non hai la disponibilità del server).

    Volendo invece operare nel modo "giusto", cioè "piglia tutti i lock, rilasciali tutti in un colpo solo", insomma alla vecchia maniera, devi fare così
    LOCK TABLES pippo READ, pluto WRITE, paperino WRITE;
    ... fai qualcosa ...
    UNLOCK TABLES;
    
    Attenzione però:
    1) durante queste operazioni nessun altro potrà leggere o scrivere su pluto e paperino (mentre potranno leggere pippo)
    2) meno roba metti lì, meglio è (proprio perchè stai bloccando il parallelismo)
    3) può capitare che le tabelle siano già LOCK-ate, nel qual caso rischi di morire di fame. Tipicamente si utilizza un timeout a scadenza del quale emetti un qualche genere di errore
    Grazie mille per l'interessamento...scusa il ritardo.
    In effetti se metto un INSERT IGNORE INTO, se non ho capito male, dovrei anche evitare il messaggio di errore. Quindi usando INTO non avrei nemmeno la necessità di inserire dei lock per quanto riguarda la registrazione...giusto?

    Invece se lavoro con tabelle connesse tra loro qual è il comando per metterle in relazione?
    Con tabelle connesse se ne blocco una le altre sono accessibili?
    Grazie
  • Re: Locking delle tabelle in mysql

    iacofr ha scritto:


    In effetti se metto un INSERT IGNORE INTO, se non ho capito male, dovrei anche evitare il messaggio di errore. Quindi usando INTO non avrei nemmeno la necessità di inserire dei lock per quanto riguarda la registrazione...giusto?
    Giusto, per UNA tabella (vedi dopo=)
    Invece se lavoro con tabelle connesse tra loro qual è il comando per metterle in relazione?
    Non c'è
    Con tabelle connesse se ne blocco una le altre sono accessibili?
  • Re: Locking delle tabelle in mysql

    +m2+ ha scritto:


    iacofr ha scritto:


    Invece se lavoro con tabelle connesse tra loro qual è il comando per metterle in relazione?
    Non c'è

    Quindi come si relazionano tra loro le tabelle?
    Sicuramente è una cretinata ma per me che sto cercando di districarmi tra più linguaggi è un pò complicato.
    Grazie mille
  • Re: Locking delle tabelle in mysql

    iacofr ha scritto:


    Quindi come si relazionano tra loro le tabelle?
    Sicuramente è una cretinata ma per me che sto cercando di districarmi tra più linguaggi è un pò complicato.
    Grazie mille
    Non si relazionano.
    O meglio non si relazionano, all'interno di mysql.
    Puoi avere, a seconda del linguaggio, delle relazioni dipendenti dal linguaggio (o dai relativi componenti).

    Comunque, per capirci, la tabella A e la tabella B sono del tutto disgiunte, per mysql (* in realtà cuttone sulla introduzione di alcuni - modesti - vincoli di integrità referenziale nelle ultime versioni).

    Se vuoi operare su più tabelle, contemporaneamente, puoi
    - LOCKare le tabelle (cioè tutte le righe di tutte le tabelle che vuoi), poi rilasciare tutti i lock
    - operare con lock a livello di riga, mediante transazioni (più o meno acid). in questo caso inizi la transazione, fai "qualcosa", poi scrivi la transazione. è una versione vagamente simile alla precedente.

    Non è che puoi dire "caro mysql, quando inizio a scrivere sulla tabella A blocca automaticamente la tabella B perchè sono relazionate".

    Le relazioni "saltano fuori" direttamente con le JOIN, quindi puoi averne nessuna, una, centomila.
  • Re: Locking delle tabelle in mysql

    +m2+ ha scritto:


    iacofr ha scritto:


    Quindi come si relazionano tra loro le tabelle?
    Sicuramente è una cretinata ma per me che sto cercando di districarmi tra più linguaggi è un pò complicato.
    Grazie mille
    Non si relazionano.
    O meglio non si relazionano, all'interno di mysql.
    Puoi avere, a seconda del linguaggio, delle relazioni dipendenti dal linguaggio (o dai relativi componenti).

    Comunque, per capirci, la tabella A e la tabella B sono del tutto disgiunte, per mysql (* in realtà cuttone sulla introduzione di alcuni - modesti - vincoli di integrità referenziale nelle ultime versioni).

    Se vuoi operare su più tabelle, contemporaneamente, puoi
    - LOCKare le tabelle (cioè tutte le righe di tutte le tabelle che vuoi), poi rilasciare tutti i lock
    - operare con lock a livello di riga, mediante transazioni (più o meno acid). in questo caso inizi la transazione, fai "qualcosa", poi scrivi la transazione. è una versione vagamente simile alla precedente.

    Non è che puoi dire "caro mysql, quando inizio a scrivere sulla tabella A blocca automaticamente la tabella B perchè sono relazionate".

    Le relazioni "saltano fuori" direttamente con le JOIN, quindi puoi averne nessuna, una, centomila.
    Siccome faccio fatica a starti dietro faccio un esempio pratico, così da capirti meglio quando mi fai un esempio.
    1) tabella: Utenti
    Composta da: "Id Utente con A.I.", "Chat_id che è univoco", "Username", "Nome o NULL", "Cognome o NULL", "Data".

    2) tabella: Negozi
    Composta da: "Id negozio A.I.", "Nome Negozio", "Settore(es:Abbigliamento)", "Luogo", "Indirizzo".

    3)Tabella: Concorso
    Composta da: "Id A.I.", Quì inserisco dalla tabella utente "Id Utente", dalla tabella Negozio "Id Negozio", "Risposta concorso", "Data".

    Nella terza tabella io mi dovrei prendere l'id utente della tabella utenti e dalla tabella Negozi l'id negozio, in modo da non ripetere sempre le stesse righe. Come prelevo questi dati dalle 2 tabelle? Purtroppo questo passaggio non riesco a capirlo...porta un pò di pazienza
  • Re: Locking delle tabelle in mysql

    Forse io con "relazione" intendo in modo errato il meccanismo, per questo mi dici che non si relazionano. Con JOIN mi richiamo i vari dati dalle diverse tabelle in modo da creare delle ralazioni, giusto? Io intendevo dire questo...
  • Re: Locking delle tabelle in mysql

    Essenzialmente fai un prodotto cartesiano con una selezione.
    Ma non hanno nulla a che vedere col locking delle tabelle.

    Quindi, a rigor di termini, dovresti aprire un altro thread (o cercarne uno dei millemila dove si tratta di join).

    essenzialmente dovrai fare qualcosa del tipo
    select elencodeicampi from tabella1 join tabella2 on tabella1.qualcosa=tabella2.qualcosa
    che è la versione "basica".
    Se hai molte tabelle si usano gli alias, e magari pure i WHERE
  • Re: Locking delle tabelle in mysql

    +m2+ ha scritto:


    Essenzialmente fai un prodotto cartesiano con una selezione.
    Ma non hanno nulla a che vedere col locking delle tabelle.

    Quindi, a rigor di termini, dovresti aprire un altro thread (o cercarne uno dei millemila dove si tratta di join).

    essenzialmente dovrai fare qualcosa del tipo
    select elencodeicampi from tabella1 join tabella2 on tabella1.qualcosa=tabella2.qualcosa
    che è la versione "basica".
    Se hai molte tabelle si usano gli alias, e magari pure i WHERE
    Si sono uscito fuori tema, cmq grazie della disponibilità. Nel caso dovessi avere bisogno di aiuto(sicuramente) posto nella giusta sezione. Grazie
Devi accedere o registrarti per scrivere nel forum
10 risposte