databank Records bewerken door meerdere gebruikers

stemmen
23

Ik heb ontworpen database tabellen (genormaliseerd, op een MS SQL server) en creëerde een standalone Windows front-end voor een toepassing die door een handvol van de gebruikers zal worden gebruikt voor het toevoegen en bewerken van informatie. We zullen een web-interface toe te voegen om te zoeken aan de overkant van onze productieruimte op een later tijdstip.

Ik ben bang dat als er twee gebruikers starten dezelfde record te bewerken dan is de laatste om de update te plegen de 'winnaar' en belangrijke informatie verloren zou zijn. Een aantal oplossingen te binnen schieten, maar ik weet niet zeker of ik ga naar een grotere hoofdpijn te creëren.

  1. Niets doen en hopen dat twee gebruikers nooit zullen dezelfde record te bewerken op hetzelfde moment. - Zou nooit happed, maar wat als dat zo is?
  2. Editing routine zou een kopie van de originele data, evenals de updates op te slaan en vervolgens te vergelijken wanneer de gebruiker het bewerken is voltooid. Als ze verschillen vertonen gebruiker en comfirm-update - zou vereisen twee kopieën van gegevens die moeten worden opgeslagen.
  3. Voeg het laatst bijgewerkt op DATETIME kolom en controleer of het overeenkomt met toen we een update, zo niet dan verschillen aan te tonen. - vraagt om nieuwe kolom in elk van de relevante tabellen.
  4. Maak een montagetafel dat registreert wanneer gebruikers beginnen met het bewerken van een record dat zal worden gecontroleerd en voorkomen dat andere gebruikers het bewerken van dezelfde record. - zou carful gedachte van het programma stroom nodig hebben om impasses en bescheiden voorkomen dat opgesloten als een gebruiker crasht uit van het programma.

Zijn er betere oplossingen of moet ik gaan voor een van deze?

De vraag is gesteld op 03/08/2008 om 22:23
bron van user
In andere talen...                            


8 antwoorden

stemmen
12

Als je niet vaak botsingen verwachten, Optimistische is waarschijnlijk uw beste weddenschap.

Scott Mitchell schreef een uitgebreide les over de uitvoering van dit patroon:
Implementatie Optimistisch concurrency

antwoordde op 03/08/2008 om 22:31
bron van user

stemmen
0

De database zal dit voor u doen. Kijk naar "selecteer ... voor update", die is ontworpen voor dit soort dingen. Het geeft je een schrijf beveiliging op de geselecteerde rijen, die u vervolgens kunt plegen of terugdraaien geven.

antwoordde op 04/08/2008 om 03:30
bron van user

stemmen
1

@ Mark Harrison: SQL Server ondersteunt dat niet syntax ( SELECT ... FOR UPDATE).

De SQL Server-equivalent is de SELECTverklaring hint UPDLOCK.

Zie SQL Server Books Online voor meer informatie.

antwoordde op 04/08/2008 om 22:54
bron van user

stemmen
1

Een andere optie is om te testen of de waarden in het record dat u het veranderen zijn nog steeds hetzelfde als toen je begon:

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

(Geven het gebied customer_nm en de gebruiker het verandert)

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' );

Je hoeft niet naar een nieuwe kolom toe te voegen aan uw tafel (en houdt deze up-to-date), maar je moet wel meer uitgebreide SQL-statements te maken en passeren nieuwe en oude velden om de opgeslagen procedure.

Het heeft ook het voordeel dat u niet vergrendelen van de platen - want we weten allemaal dat de gegevens zal uiteindelijk een verblijf opgesloten als ze niet zou moeten zijn ...

antwoordde op 13/08/2008 om 23:32
bron van user

stemmen
1

SELECT FOR UPDATE en equivalenten zijn goed zodat u op de slot voor een microscopische hoeveelheid tijd te houden, maar voor een macroscopische hoeveelheid (bv heeft de gebruiker de gegevens geladen en is niet ingedrukt 'opslaan' moet u optimistisch concurrency gebruiken als hierboven. (Welke ik denk altijd is verkeerde naam - het is pessimistischer dan 'laatste schrijver wint', dat is meestal de enige andere alternatief overwogen).

antwoordde op 01/10/2008 om 06:39
bron van user

stemmen
2

Een klassieke aanpak is als volgt:

  • voeg een boolean veld, "geblokkeerd" aan elke tafel.
  • zet u dit op valse standaard.
  • wanneer een gebruiker begint te bewerken, doet u dit:

    • vergrendel de rij (of de hele tabel als u de rij niet op slot)
    • Controleer de vlag op de rij die u wilt bewerken
    • indien de vlag waar is dan
      • informeren de gebruiker dat zij niet die rij op dit moment kunt bewerken
    • anders
      • Stel de vlag op true
    • laat de sluis

    • bij het opslaan van het record, stelt u de vlag terug naar vals

antwoordde op 01/10/2008 om 09:53
bron van user

stemmen
0

Bij mij is de beste manier heb ik een kolom lastupdate (timetamp datatype). wanneer selecteren en te actualiseren net vergelijken deze waarde nog een voorschot van deze oplossing is dat u deze kolom kunt gebruiken om het opsporen van de time data heeft verandering. Ik denk dat het niet goed als je gewoon een colum als isLock voor de check-update te creëren.

antwoordde op 24/06/2011 om 08:14
bron van user

stemmen
1

-eerste creëren ingediend (update-tijd) naar laatste aanpassing record op te slaan -wanneer elke gebruiker record op te slaan selecteert u tijd te selecteren, vergelijken tussen selecteert u de tijd en update-tijd veld in als (update-tijd)> (selecteer tijd) dat dan een andere gebruiker-update dit record na select record

antwoordde op 14/07/2016 om 11:23
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more