Come posso implementare il "blocco pessimistico" in un'applicazione asp.net?

StackOverflow https://stackoverflow.com/questions/617934

  •  03-07-2019
  •  | 
  •  

Domanda

Vorrei un consiglio da chiunque abbia esperienza nell'implementazione di qualcosa come "blocco pessimistico" in un'applicazione asp.net. Questo è il comportamento che sto cercando:

  1. L'utente A apre l'ordine n. 313
  2. L'utente B tenta di aprire l'ordine n. 313 ma gli viene detto che l'utente A ha avuto l'ordine aperto esclusivamente per X minuti.

Poiché non ho implementato questa funzionalità prima, ho alcune domande di progettazione:

  • Quali dati devo allegare al record dell'ordine? Sto considerando:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

Considererei un record sbloccato se LockRefreshedTime < (Ora - 10 min).

  • Come posso garantire che i blocchi non vengano conservati più a lungo del necessario ma che non scadano inaspettatamente?

Sono abbastanza a mio agio con jQuery, quindi gli approcci che fanno uso di script client sono i benvenuti. Questa sarebbe un'applicazione web interna, quindi posso essere piuttosto liberale con il mio uso di larghezza di banda / cicli. Mi chiedo anche se "blocco pessimistico" è un termine appropriato per questo concetto.

È stato utile?

Soluzione

Sembra che tu sia quasi arrivato lì. Non penso che tu abbia davvero bisogno di LockRefreshedTime, in realtà non aggiunge nulla. Puoi anche usare LockAcquiredTime per decidere quando un blocco è diventato obsoleto.

L'altra cosa che vorrai fare è assicurarti di fare uso delle transazioni. Devi includere il controllo e l'impostazione del blocco all'interno di una transazione del database, in modo da non finire con due utenti che pensano di avere un blocco valido.

Se si hanno attività che richiedono l'ottenimento di blocchi su più di una risorsa (ovvero più di un record di un determinato tipo o più di un tipo di record), è necessario applicare i blocchi nello stesso ordine ovunque si faccia il blocco . Altrimenti puoi avere un dead lock, in cui un bit di codice ha il record A bloccato e vuole bloccare il record B e un altro bit di codice ha B bloccato ed è in attesa del record A.

Come garantire che i blocchi non vengano rilasciati in modo imprevisto. Assicurarsi che se si dispone di un processo a esecuzione prolungata che potrebbe durare più a lungo del timeout del blocco, che aggiorna il blocco durante l'esecuzione.

Il termine "blocco esplicito" è anche usato per descrivere questo periodo di blocco.

Altri suggerimenti

L'ho fatto manualmente.

  • Memorizza la chiave primaria del record in una tabella di blocco e contrassegna il record attributo mode da modificare.
  • Quando un altro utente prova a selezionare questo record, indica l'utente record solo pronto.
  • Avere un tempo massimo impostato per bloccare i record.
  • Aggiorna i dati della pagina per i record bloccati. Mentre un utente è autorizzato a apportare modifiche, tutti gli altri utenti possono solo controllare.

La tabella di blocco dovrebbe avere un design simile a questo:

User_ID, //who locked
Lock_start_Time,
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row.
Table_Name(Entity_Name) //table name of the locked row.

La logica rimanente è qualcosa che devi capire.

Questa è solo un'idea che ho implementato 4 anni fa su richiesta speciale di un cliente. Dopo quel cliente nessuno mi ha più chiesto di fare qualcosa di simile, quindi non ho ottenuto nessun altro metodo.

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