Elaborazione simultanea dei dati da parte di più persone

2

Diciamo che ho una pagina, accessibile da più persone contemporaneamente, che elenca le informazioni che devono essere elaborate in qualche modo dall'utente, dopo di che è contrassegnato come "completato" ed effettivamente scompare, o viene lasciato non elaborato e quindi lasciato nell'elenco per essere riprovato più tardi. Qual è il modo migliore per garantire che solo una persona gestisca un dato elemento nell'elenco alla volta, supponendo che io debba mostrare l'elenco (cioè nessun requisito utente / articolo, che è quello che preferirei), e che un determinato utente può fare clic su qualsiasi elemento nell'elenco in qualsiasi momento?

Questo è un problema che è emerso più volte in cui lavoro, e non sono davvero soddisfatto della soluzione che ho implementato fino ad ora. Speravo che qualcuno avesse un'idea migliore.

Fondamentalmente la mia soluzione prevedeva la creazione di una tabella in un database per tenere traccia di chi ha accesso a quale elemento e quando, e quindi abilitare / disabilitare funzionalità basate su tale (per esempio non consentire a un utente di modificare informazioni se è stato ritirato da qualcun altro). Assomiglia a quanto segue (usando Oracle 11g ... questi sono abbreviati per brevità qui, con le colonne INFO che fungono da supporto per tutte le altre colonne che sono irrilevanti qui).

CREATE TABLE "SOME_INFO"
(
  "INFO_ID"       NUMBER(19,0)      NOT NULL ENABLE,
  "INFO"          VARCHAR2(20 BYTE) NOT NULL ENABLE,
  "IS_PROCESSED"  CHAR(1)           NOT NULL ENABLE,
  CHECK ("IS_PROCESSED" IN ('Y', 'N')) ENABLE,
  CONSTRAINT "PK_SOME_INFO" PRIMARY KEY ("INFO_ID") USING INDEX
); /

CREATE TABLE "SOME_PERSON"
(
  "PERSON_ID" NUMBER(19,0)      NOT NULL ENABLE,
  "INFO"      VARCHAR2(20 BYTE) NOT NULL ENABLE,
  CONSTRAINT "PK_SOME_PERSON" PRIMARY KEY ("PERSON_ID") USING INDEX
); /

CREATE TABLE "PROCESS_HISTORY"
(
  "INFO_ID"       NUMBER(19,0)  NOT NULL ENABLE,
  "PROCESSOR_ID"  NUMBER(19,0)  NOT NULL ENABLE,
  "CHECKED_OUT"   DATE          NOT NULL ENABLE,
  "CHECKED_IN"    DATE
); /

"Verificando" un record da SOME_INFO per un determinato utente si ottiene INSERENDO un nuovo record in PROCESS_HISTORY con INFO_ID = il record selezionato INFO_ID, PROCESSOR_ID = gli utenti PERSON_ID e CHECKED_OUT = l'ora corrente (CHECKED_IN è lasciato NULL) .

"Check In" si ottiene semplicemente impostando CHECKED_IN sull'ora corrente. Un processo automatizzato viene utilizzato per verificare periodicamente i record che sono stati estratti per più di una quantità massima di tempo predefinita (il tempo varia da una pagina all'altra in base a ciò che è coinvolto nell'elaborazione delle informazioni).

Da questo posso sapere se un dato record è attualmente controllato o meno, e quindi modificare di conseguenza il comportamento della pagina. Detto questo, non posso fare a meno di pensare che ci deve essere un modo migliore per farlo. Spero che sia un problema abbastanza comune che ci sia un metodo standard o semi-standard per fare ciò che semplicemente non sono stato in grado di trovare.

    
posta Venture Free 26.12.2011 - 20:16
fonte

2 risposte

3

I'm hoping it's a common enough problem

Sì e no.

È comune.

Ma.

In molti casi, una funzione di check-in / check-out di solito indica un problema di progettazione da qualche altra parte.

Let's say I have [data], accessible by several people concurrently, that lists information that must be processed in some way by the user, after which it is either marked as "completed" and effectively disappears, or is left unprocessed and thus left in the list to be tried again later.

Questa è una situazione di "coda di lavoro" molto tipica. Spesso, puoi salvare te stesso montagne di dolore "assegnando" il lavoro alle singole "sotto-code" in modo che una persona veda solo il lavoro a loro assegnato. Non c'è nessun "check-out / check-in" complesso; il lavoro viene invece assegnato a "sottocodifiche".

Non c'è il check-out, perché non c'è possibilità per una persona di vedere il lavoro al di fuori della sottocoda. Il contenuto della coda può cambiare, in quanto le cose vengono rimosse dalla coda di qualcun altro e assegnate a loro.

Se rifiutano di lavorare su qualcosa, potrebbero essere assegnati ad un'altra coda di lavoro. Se qualcosa ha atteso troppo a lungo può andare a una coda ad alta priorità. Puoi avere gruppi di persone che lavorano su cose leggermente diverse. Suddividere la coda di lavoro di solito consente un sacco di espansione, messa a punto e regolazione.

there is a standard or semi-standard method of doing this that I simply haven't been able to find.

Non proprio. "Standard" non si applica, poiché ogni situazione è unica.

    
risposta data 26.12.2011 - 20:39
fonte
0

Hai un tipico caso di problema di condivisione delle risorse. Dovresti leggere il link ) link )

Probabilmente dovresti utilizzare un approccio basato sulle transazioni, non permettendo a utenti diversi di lavorare sugli stessi dati nello stesso momento, ma leggerli equivale a chiarire i problemi che stai affrontando.

    
risposta data 26.12.2011 - 20:34
fonte

Leggi altre domande sui tag