Vra

Ek het ontwerp databasis tabelle (genormaliseer, op 'n MS SQL server) en het 'n selfstandige Windows voorkant vir 'n program wat deur 'n handvol van die gebruikers sal gebruik word om by te voeg en wysig inligting. Ons sal 'n web koppelvlak voeg om voorsiening te maak op soek regoor die produksie area op 'n later datum.

Ek is bekommerd dat as twee gebruikers begin dieselfde rekord redigering dan die laastes wees om die werk te pleeg die 'wenner' en belangrike inligting verlore kan gaan wees. 'N Aantal van oplossings na vore kom, maar ek is nie seker of ek gaan 'n groter kopseer skep.

  1. niks doen nie en hoop dat twee gebruikers nooit gaan dieselfde rekord te redigeer terselfdertyd. - dalk nooit happed maar wat as dit nie
  2. ?
  3. Besig roetine kan 'n kopie van die oorspronklike data sowel as die updates te slaan en dan vergelyk wanneer die gebruiker redigering klaar. As hulle show gebruiker en comfirm update verskil -. Sal vereis twee kopieë van data gestoor word
  4. Voeg laas DATETIME kolom en check dit ooreenstem wanneer ons werk, indien nie, dan verskille aan te toon. - vereis nuwe kolom in elk van die betrokke tafels
  5. .
  6. Skep 'n redigering tafel wat registreer as gebruikers begin 'n rekord wat sal nagegaan word en verhoed dat ander gebruikers van die wysiging van dieselfde rekord redigering. - sou carful gedagte van program vloei vereis om dooie punte en rekords verhoed gesluit as 'n gebruiker ineenstortings uit die program
  7. .

Is daar enige beter oplossings of moet ek gaan vir een van hierdie?

Was dit nuttig?

Oplossing

As jy ongereelde botsings verwag, Optimisties Concurrency is waarskynlik jou beste bet.

Scott Mitchell het 'n omvattende handleiding oor die implementering van die patroon:
Implementering Optimisties Concurrency

Ander wenke

'n klassieke benadering is soos volg:

  • voeg 'n boolean veld, "opgesluit" aan elke tafel.
  • voorhou om vals by verstek.
  • wanneer 'n gebruiker begin redigering, dit doen jy:

    • sluit die ry (of die hele tafel as jy die ry nie kan slot)
    • check die vlag op die ry jy wil wysig
    • as die vlag is waar dan
      • die gebruiker dat hulle nie die ry op die oomblik kan verander inlig
    • anders
      • stel die vlag om ware
    • vrylating van die slot

    • wanneer die redding van die rekord, stel die vlag terug na valse

te kies vir 'UPDATE en ekwivalente goed wat jou die slot vir 'n mikroskopiese hoeveelheid tyd hou, maar vir 'n makroskopiese bedrag (bv die gebruiker die data gelaai en het nie gedruk' red 'wat jy moet gebruik optimisties concurrency soos hierbo . (wat ek altyd dink is Verkeerd benoem -. dit is meer pessimisties as 'laaste skrywer wen', wat gewoonlik die enigste ander alternatief oorweeg word)

@ Mark Harrison:. SQL Server ondersteun nie dat sintaksis (SELECT ... FOR UPDATE)

Die SQL Server ekwivalent is die SELECT verklaring wenk UPDLOCK.

SQL Server Books Online vir meer inligting.

-Eerste skep geliasseer (update tyd) met verlede update rekord slaan -Wanneer enige gebruiker kies rekord te red kies tyd, vergelyk tussen uitgesoekte tyd en update tyd veld as (update tyd)> (kies tyd) wat beteken 'n ander gebruiker update hierdie rekord na kies rekord

Nog 'n opsie is om te toets dat die waardes in die rekord wat jy verander is die steeds dieselfde as wat hulle was toe jy begin het:

SELECT 
    customer_nm,
    customer_nm AS customer_nm_orig
FROM demo_customer
WHERE customer_id = @p_customer_id

(vertoon die veld customer_nm en die gebruiker verander dit)

UPDATE demo_customer
SET customer_nm = @p_customer_name_new
WHERE customer_id = @p_customer_id
AND customer_name = @p_customer_nm_old

IF @@ROWCOUNT = 0
    RAISERROR( 'Update failed: Data changed' );

Jy hoef nie na 'n nuwe kolom by te voeg aan jou tafel (en hou dit op datum), maar jy moet meer uitgebreide SQL-stellings te skep en te slaag nuwe en oud velde om die gestoor proses.

Dit het ook die voordeel dat jy nie sluit die rekords - want ons almal weet dat rekords sal uiteindelik bly toegesluit wanneer hulle nie behoort te wees ...

Die databasis sal dit vir jou doen. Kyk na "kies ... vir werk", wat ontwerp is net vir hierdie soort van ding. Dit sal jou 'n skryf slot gee op die gekose rye, wat jy dan kan pleeg of rol terug.

Met my, die beste manier wat ek het 'n kolom lastupdate (timetamp data type). wanneer kies en werk net vergelyk hierdie waarde 'n ander vooraf van hierdie oplossing is dat jy hierdie kolom kan gebruik om op te spoor die tyd data het verander. Ek dink dit is nie goed as jy net 'n kolom soos isLock skep vir check update.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top