Domanda duplicata da:
/programming/129329/optimistic-vs-pessimistic-locking
Copia / incolla risposta dal link sopra:
Il blocco ottimistico è una strategia in cui leggi un record, prendi nota di un numero di versione e verifica che la versione non sia cambiata prima di riscrivere il record. Quando si riscrive il record, si filtra l'aggiornamento sulla versione per assicurarsi che sia atomico. (ovvero non è stato aggiornato tra quando si controlla la versione e si scrive il record sul disco) e si aggiorna la versione in un colpo solo.
Se il record è sporco (ovvero versione diversa dalla tua), interrompi la transazione e l'utente può riavviarla.
Questa strategia è maggiormente applicabile ai sistemi ad alto volume e alle architetture a tre livelli in cui non si mantiene necessariamente una connessione al database per la sessione. In questa situazione il client non può effettivamente mantenere i blocchi del database poiché le connessioni vengono prese da un pool e potresti non utilizzare la stessa connessione da un accesso al successivo.
Il blocco pessimistico è quando si blocca il record per uso esclusivo fino a quando non si è finito con esso. Ha un'integrità molto migliore rispetto al blocco ottimistico, ma richiede di stare attenti con il design dell'applicazione per evitare deadlock. Per utilizzare il blocco pessimistico è necessaria una connessione diretta al database (come in genere accade in un'applicazione server client a due livelli) o un ID transazione disponibile esternamente che può essere utilizzato indipendentemente dalla connessione.
In quest'ultimo caso, si apre la transazione con il TxID e quindi si riconnette utilizzando tale ID. Il DBMS mantiene i blocchi e consente di riprendere il backup della sessione tramite TxID. Ecco come funzionano le transazioni distribuite che utilizzano protocolli di commit a due fasi (come Transazioni XA o COM +).
Modifica (aggiunta di ulteriori informazioni per rispondere alla domanda di rendimento):
Le prestazioni dipendono dal tuo ambiente. Prendi in considerazione i seguenti fattori per decidere:
troverai ottimista sarà migliore a causa della concorrenza nella maggior parte delle situazioni. A seconda del RDBMS e dell'ambiente, tuttavia, potrebbe essere meno o più performante. In genere con il blocco Optimistic scoprirai che il valore deve essere modificato in una riga da qualche parte.
Con MS SQL Server, ad esempio, viene spostato in TempDB e alla fine della colonna viene aggiunto qualcosa tra 12-14 byte. L'attivazione del blocco ottimistico con un livello di isolamento come Isolamento istantanea può causare frammentazione e il tuo fattore di riempimento dovrà essere regolato poiché le righe ora hanno dati aggiuntivi alla fine che potrebbero causare una pagina quasi piena per causare una divisione della pagina, che si abbasserà la tua prestazione. Se il tuo TempDB è sotto ottimizzato, non sarà così veloce.
Quindi immagino che una checklist sia:
- -Hai abbastanza IO / risorse per gestire la forma del versioning delle righe? In caso contrario, stai aggiungendo un sovraccarico. In tal caso, se stai leggendo spesso i dati mentre li stai spesso bloccando per le scritture, noterai un buon miglioramento della concorrenza tra letture e scritture (sebbene le scritture blocchino ancora le scritture, le letture non bloccheranno più le scritture e viceversa)
- -Il tuo codice è suscettibile a deadlock o si verifica il blocco? Se non si verificano lunghi blocchi o molti deadlock, l'overhead aggiuntivo del blocco Optimistic non renderebbe le cose più veloci, ovviamente, nella maggior parte dei casi qui stiamo parlando di millisecondi.
- -Se il tuo DB è grande (o su hardware molto limitato) e le tue pagine di dati sono quasi piene, a seconda del RDBMS, potresti causare spaccature di pagina importanti e frammentazione dei dati, quindi assicurati di prendere in considerazione la reindicizzazione dopo averlo acceso.
Questi sono i miei pensieri in merito, aperti ad ascoltare di più dalla comunità.