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

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #15 il: 08 Aprile 2008, 15:57:15 »
Per caso non viene chiusa la connessione ?
E' probabile che il file sqlite rimanga aperto per qualche motivo, non permettendone più la lettura da qualche altra applicazione che, invece, controlla il bit di chiusura.

Un consiglio per i campi autoincrement: se in ambiente multiutenza, nel range di tempo tra la lettura dell'ultimo valore, e la scrittura dello stesso incrementato, potrebbero esserci degli accessi contemporanei che rendono invalido lo sforzo. Se prendiamo il caso che il valore corrente sia 10, e predisponiamo il successivo inserimento con il valore 11, e se qualcuno nel frattempo chiede la stessa cosa, anche quest'ultimo imposterà il valore 11, per cui il database avrà due "11", incasinando così la chiave. Ovviamente, se è presente un controllo da parte del database (come su MySQL o PostgreSQL), l'ultimo record verrebbe rigettato, riportando un errore, ma in sqlite non sò cosa possa accadere...

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #16 il: 08 Aprile 2008, 16:02:58 »
Ci avevo gia pensato infatti, e la tua osservazione cade proprio a fagiuolo!
Pensavo di aggiungere un campo boolean ad ogni table, e quando il primo lo apre in EDIT, la prima operazione che fa lo mette TRUE come impegnato, così gli altri possono solo leggerlo fintantochè le modifiche apportate non sono chiuse.
Non so se funzionerà, ma penso di provarci.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #17 il: 08 Aprile 2008, 17:55:44 »
Bè, così in fondo simuli il lock del record...
Però fai sempre attenzione alle modifiche concorrenti...

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #18 il: 08 Aprile 2008, 18:06:28 »
Bisogna proprio essere oltremodo sfigati per arrivare a registrare contemporaneamente il blocco nel medesimo microsecondo!
Io intendo infatti registrare il nuovo record vuoto con il flag di blocco prima di effettuare le modifiche finali e pertanto penso sia alquanto improbabile una sovrapposizione di eventi, non credi?
Nel momento in cui il secondo utente accede al medesimo record per attivare il proprio flag di blocco, trovandolo occupato gli viene ritornato il messaggio di indisponibilità e pertanto gli viene proposto il nuovo record seguente.
Se invece si tratta di EDIT, il primo che accede lo blocca e gli altri ricevono il mess di indisponibilità.
Dimmi dove fa acqua il mio ragionamento per cortesia.

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #19 il: 08 Aprile 2008, 18:15:19 »
Nessuna pecca nel tuo ragionamento logico, ma per quanto riguarda la sfiga ti faccio presente la "Legge di Murphy" e, comunque e a parte gli scherzi, il problema si verifica in percentuale proporzialmente al numero di utenti connessi. Ovviamente se sei solo tu, la cosa non si verifica.

La logica di locking e della contemporaneità degli eventi, è una logica abbastanza complessa, e comunque adottata da tutti i dbms più evoluti. Su sqlite non ho esperienza, per cui le mie parole possono essere buttate al cesso, se sqlite già prevede questa logica.

Ad ogni modo, la tua implementazione può andare bene.

Approvo ! :-)

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #20 il: 08 Aprile 2008, 19:00:39 »
Grazie Gran Maestro, le tue parole mi confortano!

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #21 il: 08 Aprile 2008, 19:21:32 »
scusate ma sqlite è un database locale per cui credo che il problema di due utenti che scrivano un record nello stesso istante non si può verificare a meno che un utente non utilizzi contemporaneamente due programmi.
secondo mettere una routine di blocco  all' interno di un programma è inutile
visto che il programma lo realizziamo noi ed eviteremo di lasciare procedure con database aperti.

Secondo me ogni procedura che accede al db deve sempre essere lei ad aprire la connessione e di conseguenza a chiuderla, evitando di avere una apertura della connessione a inizio programma e la chiusura a fine programma  :-)

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: cancellazione record in table sqlite3
« Risposta #22 il: 08 Aprile 2008, 19:31:02 »
Per evitare problemi di sovrapposizione di accessi, penso basti dire al DB di utilizzare una connessione esclusiva con "BEGIN EXCLUSIVE". In questo modo ogni accesso successivo al DB verrà bloccato finché essa non sarà terminata.
Visita il mio sito personale: http://www.leonardomiliani.com

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #23 il: 08 Aprile 2008, 20:03:54 »
@fsurfing
Se io metto il DB Sqlite su un server come backend ed installo i frontend sui client che ne elaborano i dati, non faccio nulla di più di quello che faccio ora con due file Access, uno sul server con i soli dati, ed uno sui client con il prg di gestione.
Quindi in tal caso il problema si pone eccome, a meno che qualcuno mi dica che non è possibile accedere ad un file SQlite3 nel modo che ho appena spiegato.

@Leo
E' una cosa che voglio proprio provare quella che hai detto; se così fosse penso che Sqlite si meriti qualche apprezzamento in più.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #24 il: 08 Aprile 2008, 20:11:52 »
@darth, non vorrei fare il rompiscatole... ed è anche possibile che mi sbaglio ma mi pare di aver letto tempo fa da qualche parte (Preciso é! :lol: )che sqlite non fosse affatto consigliato per utilizzo in applicazioni client-server per questioni di sicurezza ( ad esempio non puoi impostare password e utente)ma solo per qpplicazioni stand-alone.
poi ti ripeto sono anche io un profano ma sicuramente ponendo il problema qualcuno  potrà chiarirci le idee :-)

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #25 il: 08 Aprile 2008, 20:27:19 »
sqlite browser lo puoi trovare qui: http://sourceforge.net/projects/sqlitebrowser/

è semplicissimo, lo scarichi , lo decomprimi e lo utilizzi subito senza installarlo, vedrai che lo troverai meglio di kexi :-)

g.paolo

  • Visitatore
Re: cancellazione record in table sqlite3
« Risposta #26 il: 08 Aprile 2008, 22:06:23 »
Ti ringrazio per l'informazione circa il programma. Mo lo provo subito!
Per quanto concerne come dici tu le password e la sicurezza, queste le ho sempre gestite a livello di frontend e mai sul backend che comunque era protetto in modo completo sia dalla visualizzazione che dalla modifica, e quando dico visualizzazione mi riferisco al fatto che sul disco del server non lo vedi affatto.
La gestione della sicurezza da parte di questi database con le palle, mi ha sempre lasciato un po perplesso, perchè quando una cosa non sai come funziona, diffidi sempre.
Comunque, mai dire mai, quindi voglio provare anche con MySql.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: cancellazione record in table sqlite3
« Risposta #27 il: 08 Aprile 2008, 23:56:44 »
:cappello: vedo che di server e affini ne sai molto più di me!

comunque tieni presente che i dati contenuti in db sqlite si leggono benissimo con un semplice editor esadecimale in quanto non vengono criptati

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.256
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: cancellazione record in table sqlite3
« Risposta #28 il: 09 Aprile 2008, 06:56:52 »
Io uso l'editor del database di Gambas, anche quella è una strada. Per la creazione del db relazionale sto sperimentando Ombrello Kde, che non mi crea il database ma puo' esportare i comandi di creazione in una query mysql.

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: cancellazione record in table sqlite3
« Risposta #29 il: 09 Aprile 2008, 07:55:01 »
Il consiglio di usare SQLite solo per applicazioni stand-alone deriva dal fatto che non tratta i thread come gli altri DB. Quindi non ha una coda in cui inserisce le query e le esegue via via. Se ad esempio apro una transazione su una tabella per aggiungere dei dati dalla postazione A e poi vado a prendermi un caffé prima di salvare la transazione stessa, il collega sulla postazione B può modificare il DB prima di me e magari gli stessi dati a cui io stavo lavorando. Ecco perché o si utilizzano solo transazioni esclusive, in modo che dalla postazione B si abbia il messaggio di "DB occupato" oppure si crea a livello di codice un sistema di ticket in modo tale che non possano sovrapporsi 2 transazioni sugli stessi dati.
Visita il mio sito personale: http://www.leonardomiliani.com