Autore Topic: cancellazione record in table sqlite3  (Letto 4507 volte)

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #30 il: 09 Aprile 2008, 08:02:09 »
@fsurfing
Certo, questo lo so bene, ma conto di usare un software da mettere sul server per rendere invisibile la cartella in cui risiede il DB Sqlite3, in armonia col principio: "cio che non vedi, non stuzzica l'interesse!"
E' una prova ovviamente, quella che voglio fare, ma che personalmente ritengo più sicura di tanti metodi di protezione applicati a DB "visibili".

@leo
Penso che il tuo consiglio dell'EXCLUSIVE sia un buon metodo...da provare!
L'esempio che hai fatto è significativo, ed il pensare che nella "coda" ci sono transazioni tra loro contrastanti, non mi garba affatto, anche perchè in tal modo non mi è dato sapere a priori quale delle medesime avrà successo. Preferisco di gran lunga il metodo del blocco, così chi accede ad un record bloccato, attende tempi migliori, e se proprio lo vuol modificare, prima si informa circa le modifiche che gli altri fanno.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #31 il: 09 Aprile 2008, 11:31:13 »
Vedo che questo discorso ha acceso un bel dibattito, ma alcuni a mio avviso hanno idee poco chiare sul concetto, anche dovute alla poca esperienza con i database.

Un tempo esisteva il DB3, che funzionava più o meno come sqlite, con qualcosina in più ma qualcosina in meno (es. non era SQL compliance...).
Questo motore, che poi era un driver come sqlite, non gestiva alcuna sicurezza (come sqlite), e non aveva fondamentalmente basi di controllo sugli accessi contemporanei. Questo si traduceva nel fatto che l'applicazione doveva a questo punto gestire essa stessa tutte le cose, mentre il db rimaneneva nel rango di puro e semplice archivio.
Però, come qualcuno ha fatto giustamente notare, il fatto che sqlite non gestisca nè sicurezza nè accessi contemporanei, obbliga il programmatore a mettere i suddetti a livello di programma.
Come pure accennato, non è detto che io stesso non possa lanciare due applicazioni in contemporanea (cosa che si faceva normalmente per test anche con il DB3), oppure che il database anche se gestito in modalità client-server tramite apposito portale, non debba comunque prevedere l'accesso contemporaneo di più utenti.
E' da tener presente che mettendo in opera un'applicazione che preveda un portale verso una rete, deve per forza di cosa gestire questi problemi.

Tutto il discorso resta comunque valido in ogni caso si preveda la possibilità di archiviare dati da più punti, mentre è sicuramente inutile in applicazione stand-alone; un esempio potrebbe essere l'utilizzo di sqlite come contenitore di dati di configurazione di un'applicazione (invece di un file...).

Attenzione quindi, ad affrontare in modo corretto ciò che si stà mettendo in opera.

Ovviamente il mio eè un consiglio spassionato...

Bye

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #32 il: 09 Aprile 2008, 12:00:46 »
Sempre preciso il nostro Gran Maestro, e questo è bene.
L'importante è infatti partire con il piede giusto in modo da non trovarsi poi infognati in un "cul de sac"!
Conoscendo bene i limiti delle cose, si impara a gestirle opportunamente.
Pertanto prima di cimentarmi con DB tipo MySQL e company, voglio provare con Sqlite, anche perchè la mole di dati da gestire non sono centinaia di migliaia, ma solo qualche decina suddivisi in piu tabelle.
Rimane da vedere come si comporterà il DB in rete, in termini di velocità intendo, perchè anche questa cosa per me è tutta da scoprire.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #33 il: 09 Aprile 2008, 12:37:04 »
La velocità in rete non dipende dal db, ma dalla rete stessa.

Se costruisci un programma in C, oppure in Gambas, a livello di interfaccia esterna, sempre se i driver sono fatti bene, la velocità è la stessa, nessuna differenza.

Tanto per essere precisi... :-P

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: cancellazione record in table sqlite3
« Risposta #34 il: 09 Aprile 2008, 15:41:21 »
Sul posto di lavoro ho 2 PC entrambi con Ubuntu e collegati in rete tramite un modesto router. Su di uno c'è il database a cui accedo dalle 2 postazioni tramite NFS. Tralasciando il tempo perso per la connessione al DB, una volta che è "agganciato" lavora quasi come fosse in locale. Ovviamente, io memorizzo poche centinaia di byte per volta per cui le prestazioni in velocità sono assolutamente insignificanti per me.

Torno inoltre sul discorso del "giusto approccio" al DB accennato da md9327.
Facciamo un paio di esempi per far capire meglio il discorso:

1)
ho un DB in cui memorizzo solo dati in maniera sequenziale, esempio: le uscite di cassa. E' ovvio che qui la tabella che accoglie i dati è una semplice pila in cui io "verso" dentro i dati man mano che mi arrivano senza dovermi preoccupare di cosa sta facendo il collega sull'altra postazione, da cui sta registrando le sue uscite.
In questo caso non ho bisogno di nessun controllo perché non avrò mai la situazione in cui 2 utenti accedono agli stessi dati contemporaneamente.

2)
ho un DB in cui memorizzo i documenti di vendita che genero via via (fatture). In questo caso DEVO obbligatoriamente implementare un qualche tipo di controllo altrimenti potrei creare confusione nel DB. Prendiamo il caso in cui il cassiere della postazione A venda un articolo per cui il cliente vuole la fattura. A questo punto, apre la maschera di inserimento del documento ed il programma legge dal DB l'ultimo numero di fattura generato, es. 15, e numera il nuovo documento con 16. Il cassiere comincia a riempire la maschera del documento ma le voci da inserire sono molte e l'operazione richiede del tempo.
Adesso il cassiere della postazione B deve emettere un documento di vendita anch'egli. Apre la maschera ed il suo client pesca dal DB l'ultimo numero di documento generato per numerare la nuova fattura. Siccome però la transazione del cassiere sulla postazione A non è ancora stata conclusa e quindi il documento non è stato salvato e la numerazione aggiornata, il DB fornisce al cassiere della postazione B lo stesso numero, vale a dire 15. Poi il cassiere conclude la transazione prima del cassiere della postazione B e salva quindi nel database il documento 16 prima che lo faccia il cassiere della postazione A. Quest'ultimo, quando terminerà la sua transazione, creerà un altro documento numerato 16. Ecco quindi che si è presentato il problema se non è stato previsto un sovrapporsi di accessi.

Come si può risolvere? O con il BEGIN EXCLUSIVE oppure così, con una soluzione "casereccia" ma semplice ed efficace...
Dalla postazione principale, se parto per emettere una fattura, salvo sulla postazione secondaria un piccolo file nascosto che poi cancello al termine della transazione. Il client della postazione secondaria esegue un controllo ogni volta che l'operatore richiede l'emissione di una nuova fattura: se esiste quel file, avverte l'operatore che l'emissione di nuove fatture è momentaneamente bloccata!  
Semplice ma funzionale :ehm:
Visita il mio sito personale: http://www.leonardomiliani.com

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #35 il: 09 Aprile 2008, 15:54:10 »
@ leo72 riprendendo il tuo esempio, quindi fintanto che il cassiere A fon finisce la fattura il cassiere B non può crearne un altra?
non è più semplice (come utilizzo)realizzare il programma in modo che il numero di fattura venga calcolato solamente durante l' operazione di salvataggio della stessa (ovvero a compilazione compiuta)con un opzione di accesso exclusive , in questo modo il tempo di utilizzo del bd per ogni operazione diventa minimo e l'utilizzo del db permette una quasi completa contemporaneità. :-)

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #36 il: 09 Aprile 2008, 16:08:01 »
E' vero che la cosa viene ridotta, ma non eliminata; la casualità è sempre in agguato.

Come ha descritto leo, anticamente si usava un simile accorgimento, però sul database stesso, approntando opportunamente una tabella di numeri fattura prenotati. Anche questo approccio, però, aveva dei problemi, legati al fatto che un operatore poteva annullare la fattura che stava compilando, creando così dei buchi, che tra le altre cose non erano molto legali; diciamo che andavano a finire come fatture annullate.

Con un'approccio odierno è possibile, utilizzando ad esempio una sequence, far inserire il numero automaticamente dal motore del db, in fase di inserimento; però questo comunque implica sia un problema simile a quanto scritto sopra, sia un controllo di contemporaneità da parte del motore db. Quest'ultima cosa è sicuramente espletata dai database moderni, su sqlite non sò...

A parte l'ipotesi di gestire fatture, se non esistono problemi di mantenere una numerazione costante e senza buchi, l'approccio di cui sopra, ovvero la prenotazione dei numeri, può essere un'ipotesi trattabile, e anche abbastanza semplice da realizzare (basta una tabella e poco codice...).

Per l'approccio della modalità EXCLUSIVE avrei dei dubbi, legati più al fatto di gestire nel più breve tempo possibile il locking, altrimenti non lavora più nessuno. Su DB3, ad esempio, si usava un piccolo loop a tempo che analizzava la possibilità di modificare un record, e se entro il tempo previsto ci riusciva bene, altrimenti avvertiva l'utente che l'operazione non era possibile, proponendo un siccessivo tentativo.

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #37 il: 09 Aprile 2008, 18:19:51 »
Mi piace proprio questa discussione perchè stanno uscendo molte informazioni utilissime che spero possano servire molto anche a chi verrà piu avanti.
Tutto sommato, analizzando bene i dettagli, mi convinco sempre più che per il mio caso in cui non ho da lavorare con numeri fattura che esigono l'assenza di buchi, la soluzione che ho ventilato in precedenza circa la  prenotazione del record con il flag di blocco, possa essere adeguata al mio scopo.
Quando avrò fatto le prove del caso in sito, vi saprò dire come funziona o se sarà il caso che adotti una soluzione o un DB diversi.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: cancellazione record in table sqlite3
« Risposta #38 il: 10 Aprile 2008, 07:28:04 »
Non aggiorno subito la numerazione delle fatture, questa operazione la compia solo quando l'utente preme effettivamente il pulsante di salvataggio. Altrimenti, se decidesse di annullare l'operazione, mi vedrei costretto a modificare nuovamente la numerazione salvata sul DB.

Però ho necessità di sapere subito che numero dare al documento: ecco perché blocco l'altro operatore.
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #39 il: 10 Aprile 2008, 07:33:27 »
Molto utile il tuo chiarimento, per impieghi futuri da parte mia.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #40 il: 10 Aprile 2008, 14:17:52 »
Eheheheh, con questi discorsi ho riacceso antiche zone della mia memoria e, devo dire, mi viene quasi una lagrimuccia...  :-(

Bè, un bel rinfresco di idee, sicuramente saranno utili, specialmente a chi non ha mai affrontato questo tipo di problemi...

Bye