Domanda

Qualche tempo fa, ho scritto un programma utilizzato da più utenti per gestire la creazione compravendite. Non ho fatto lo sviluppo da qualche tempo, e non riesco a ricordare come ho gestito la concorrenza tra gli utenti. Così, sto cercando qualche consiglio in termini di design.

L'applicazione originale aveva le seguenti caratteristiche:

  • Un cliente pesante per utente.
  • Un database unico.
  • L'accesso al database per ogni utente di inserimento / aggiornamento / cancellazione dalle compravendite.
  • Una griglia nell'applicazione riflettente tabella traffici. Quella griglia in fase di aggiornamento ogni volta che qualcuno cambia un accordo.
  • Sto usando WPF.

Ecco cosa mi chiedo:

  1. È corretto pensare che non dovevo cuore la connessione al database per ogni applicazione? Considerando che c'è un Singleton in ogni, mi sarei aspettato una connessione per client senza alcun problema.

  2. Come posso fare per prevenire la concorrenza degli accessi? Credo che dovrei chiudere quando si modificano i dati, però non ricordo come.

  3. Come faccio a impostare la griglia di aggiornare automaticamente ogni volta che il mio database viene aggiornato (da un altro utente, per esempio)?

Grazie in anticipo per il vostro aiuto!

È stato utile?

Soluzione

  1. Si consideri sfruttando Connection Pooling per ridurre numero di connessioni. Vedere: http://msdn.microsoft.com/en-us/library/8xx3tyca aspx

  2. blocco il più tardi possibile e il rilascio il più presto possibile per massimizzare la concorrenza. È possibile utilizzare TransactionScope (vedi: http://msdn.microsoft. com / it-it / library / system.transactions.transactionscope.aspx e http://blogs.msdn.com/b/dbrowne/archive/2010/05/21/using-new-transactionscope-considered-harmful.aspx ) se si dispone di più azioni db che devono andare insieme per gestire la consistenza o semplicemente gestire nel DB proc memorizzato. Mantenere la query semplice. Seguire i seguenti suggerimenti per capire come il blocco di lavoro e come ridurre i conflitti di risorse e di stallo: http: // www .devx.com / gethelpon / 10MinuteSolution / 16488

  3. Non sono sicuro che altri db, ma per SQL, è possibile utilizzare SQL Dipendenza, vedere http://msdn.microsoft.com/en-us/library/a52dhwx7 (v = vs.80) aspx

Altri suggerimenti

La concorrenza è di solito concesso dal DBMS utilizzando serrature. Locks sono un tipo di semaforo che concedere il blocco esclusivo ad una certa risorsa e consentire altri accessi a essere limitate o in coda (limitato solo nel caso si utilizza UNCOMMITED letture).

Il numero di connessioni per sé non rappresenta un problema mentre non stanno raggiungendo altezze dove si potrebbe toccare l'impostazione del DBMS max_connections. In caso contrario, si potrebbe ottenere un problema di connessione ad esso per scopi di manutenzione o per spegnerlo.

DBMS solito uso un concetto di entrambi i blocchi di tabella (MyISAM) o blocchi di riga (InnoDB, la maggior parte degli altri DBMS). Il tipo di blocco determina il volume della serratura. blocchi di tabella possono essere molto veloce ma sono generalmente considerate inferiori alla fila blocchi a livello.

blocchi a livello di riga si verificano all'interno di una transazione (implicita o esplicita). Quando si avvia manualmente una transazione, si inizia l'ambito della transazione. Fino a quando si chiude manualmente la portata dell'operazione, tutte le modifiche apportate saranno attributi a questa transazione esatto. Le modifiche apportate anche obbedire alla ACIDO paradigma .

Ambito della transazione e come usarlo è un argomento troppo a lungo per questa piattaforma, se si vuole, posso pubblicare alcuni link che portano ulteriori informazioni su questo argomento.

Per gli aggiornamenti automatici, la maggior parte dei database supporta una sorta di meccanismo di scatto, che è il codice che viene eseguito in azioni specifiche sulla base di dati (ad esempio la creazione di un nuovo record o il cambiamento di un record). Si potrebbe pubblicare il tuo codice all'interno il trigger. Tuttavia, si dovrebbe informare solo un'applicazione recieving delle modifiche, non proprio "fare" le modifiche dal grilletto, anche se la lingua potrebbe rendere possibile. Si ricorda che l'azione che ha innescato il codice viene sospeso fino al completamento con il codice di attivazione. Ciò significa che un trigger magro è meglio, se è necessario a tutti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top