Newsgroup: it.comp.software.database
Titolo: Chi mi spiega il lock tables in MySQL?

Ho il seguente problema:
- ho una tabella che contiene i dati di produzione che arrivano in 
automatico dall'impianto;
- ogni ora devo 'azzerare' i dati e confluire i dati raccolti verso la 
tabella dei dati di produzione giornaliera.
- mentre faccio questa operazione, vorrei che gli agent che aggiornano 
il database si mettessero in attesa.
Ho pensato al Lock tables, ma non mi funziona:
LOCK TABLES produzione_h WRITE;
mi dice OK, ma se faccio un update me lo fa senza battere ciglio: 
sbaglio qualcosa o Lock tables serve a qualcos'altro, che ovviamente non 
ho capito?

 mi dice OK, ma se faccio un update me lo fa senza battere ciglio:
L'update lo fai dalla stessa connessione o da una diversa?
Il lock serve per bloccare le ALTRE connessioni, e lasciare che la tua 
possa lavorare in pace sulla tabella.
Bye.

Alessandro Pellizzari ha scritto:

Li ho provati entrambi (usando "Mysql Query Browser", ho creato una 
nuova connessione).

Il Wed, 22 Jul 2009 11:38:33 +0200, Quasimodo ha scritto:

Non sono sicuro, ma leggendo
http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
credo dovresti acquisire i lock in coppia.
Un lock durante la transazione che inserisce i dati di produzione, ed un 
lock durante la transazione che sposta i dati della tabella secondaria.
Comunque ti suggerisco di lasciar perdere MySQL.
PostgreSQL è molto meglio; anche la documentazione è molto più chiara.
 
PostgreSQL implementa inoltre il Multiversion Concurrency Control (MVCC)
http://www.postgresql.org/docs/8.4/static/mvcc.html
e non dovresti aver bisogno di lock espliciti.
P.S.: non sono comunque sicuro di capire perchè hai bisogno di una 
tabella separata che poi devi azzerare periodicamente.
Ciao  Manlio

Manlio Perillo ha scritto:

Il DB potrebbe anche essere un qualcosa di embedded (tipo Firebird).
Comunque, per il momento penso di scavalcare il problema mettendo un 
flag in una tabella di servizio prima di iniziare a leggere i dati, 
forzando gli altri agent ad attenderne l'azzeramento.
 >
 > P.S.: non sono comunque sicuro di capire perchè hai bisogno di una
 > tabella separata che poi devi azzerare periodicamente.
 >
 >
 >
 > Ciao  Manlio
Devo replicare (come demo) il funzionamento (logico) di un software 
industriale prodotto da un'azienda ormai defunta. Lo scopo è quello di 
creare lo scheletro di una un'applicazione in grado di sostituire in 
futuro il sistema di archiviazione.
In questo software c'erano le seguenti tabelle (virtuali) implementate 
come lista circolare:
- produzione_5	(dati derivati/integrati dal sistema di acquisizione ogni 
5 minuti) 12*N campioni per ogni punto di misura
- produzione_h	(dati calcolati dal centro ogni ora usando produzione_5) 
24*N valori per ogni misura
- produzione_g	(dati calcolati dal centro ogni giorno usando 
produzione_h) lista circolare 31*N valori per ogni misura
(N>=1 dipende da quanti valori si vogliono tenere)
Eccetera (produzione_m e produzione_y)...
La tabella a 5 minuti viene aggiornata di continuo in background da un 
agent che dovrebbe essere in grado di leggere i dati direttamente dal 
database originale (che non è un db ma una shared memory). Questo agent 
va in update sulla tabella produzione_5 in maniera continua. In questo 
modo ho la possibilità di interrogare il database secondo le mie 
esigenze e non secondo le modalità previste dall'applicazione originale.
Dalla tabella a 5 minuti devo calcolare tutti i valori per le ore, i 
giorni, i mesi e gli anni.
Il problema è che mentre aggiorno le medie orarie, la tabella a 5 minuti 
non mi deve cambiare...

Quasimodo ha scritto:

a me sembra chiaro..
  IN EXCLUSIVE MODE [NOWAIT] lock:
* The session that holds the lock can read and write the table.
* Only the session that holds the lock can access the table. No other 	 
  session can access it until the lock is released.
* Lock requests for the table by other sessions block while the IN 
EXCLUSIVE MODE lock is held.
ricordandosi di fare UNLOCK TABLES..
O no?

 [...]
Ciao  Manlio