Szerkesztése adatbázisrekordok több felhasználó

szavazat
23

Általam tervezett adatbázis táblák (normalizált, egy MS SQL szerver), és létrehozott egy önálló Windows kezelőfelületet olyan alkalmazás, amely használható egy maroknyi felhasználók hozzá és módosítása. Mi lesz hozzá egy webes felületen teszi lehetővé a keresést Átfedés a termelési terület egy későbbi időpontban.

Aggódom, hogy ha két felhasználó kezdeni szerkeszti ugyanazt a rekordot, majd az utolsó, hogy kötelezzék a frissítés lesz a „győztes”, és fontos információ is elveszhet. Számos megoldást jöhetnek szóba, de nem vagyok biztos benne, hogy fogok létrehozni egy nagyobb fejfájást.

  1. Nem csinál semmit, és reméljük, hogy két felhasználó soha nem fog szerkeszti ugyanazt a rekordot egy időben. - Lehet, hogy soha nem happed de mi van, ha mégis?
  2. Szerkesztése rutin lehet tárolni egy másolatot az eredeti adatokat, valamint a frissítések, majd hasonlítsa össze, amikor a felhasználó befejezte a szerkesztést. Ha eltérnek show felhasználó és comfirm frissítés - lenne szükség két példányban adat tárolható.
  3. Hozzá utolsó frissítése DATETIME oszlopot, és ellenőrizzük, hogy megfelel amikor frissíteni, ha nem, akkor különbséget mutatnak. - megköveteli az új oszlop az egyes vonatkozó táblázatokat.
  4. Hozzon létre egy szerkesztési táblázatot, amely rögzíti, ha a felhasználók a szerkesztés megkezdéséhez egy nyilvántartást, amely ellenőrizni fogják, és megakadályozza, hogy más felhasználók szerkeszthetik ugyanazt a rekordot. - lenne szükség carful gondolat műsorfolyam megelőzésére holtpontok és feljegyzések zárolását, ha a felhasználó összeomlik a programból.

Vannak olyan jobb megoldásokat, vagy kell menni egy ilyen?

A kérdést 03/08/2008 22:23
a forrás felhasználó
Más nyelveken...                            


8 válasz

szavazat
12

Ha azt várod, ritkán ütközés, optimista konkurencia talán a legjobb megoldás.

Scott Mitchell írt egy átfogó bemutató végrehajtó minta:
Végrehajtási optimista konkurencia

Válaszolt 03/08/2008 22:31
a forrás felhasználó

szavazat
0

Az adatbázis ezt az Ön számára. Nézd meg „válasszon ... a frissítés”, amelynek célja éppen az ilyen jellegű dolog. Ez ad egy írási zár a kijelölt sorok, amit aztán elkövetni vagy visszaállíthatja.

Válaszolt 04/08/2008 03:30
a forrás felhasználó

szavazat
1

@ Mark Harrison: SQL Server nem támogatja, hogy a szintaxis ( SELECT ... FOR UPDATE).

Az SQL Server egyenértékű a SELECTnyilatkozat célzást UPDLOCK.

Lásd az SQL Server Books Online talál.

Válaszolt 04/08/2008 22:54
a forrás felhasználó

szavazat
1

Egy másik lehetőség, hogy tesztelje, hogy az értékek a rekord, hogy változnak az még mindig ugyanaz, mint volt, amikor elkezdted:

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

(Megjeleníti a customer_nm területen, és a felhasználó megváltoztatja azt)

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

Nem kell, hogy egy új oszlopot a táblázatban (és tartsa naprakész), de nem kell, hogy több részletes SQL, és adja át az új és a régi területeken a tárolt eljárást.

Azt is megvan az az előnye, hogy nem zár a bejegyzések - mert mindannyian tudjuk, hogy a rekordok a végén maradhat zárva, mikor nem kell ...

Válaszolt 13/08/2008 23:32
a forrás felhasználó

szavazat
1

SELECT FOR UPDATE és ekvivalens jók nyújtjuk tartsa a lakat egy mikroszkopikus mennyiségű időt, de egy makroszkopikus mennyiségű (pl a felhasználó az adatokat betölteni, és nem nyomta a „Mentés” kell használni optimista konkurencia, mint fent. (Ami mindig azt gondolom, van misnamed - ez pesszimistább, mint az „utolsó író nyer”, ami általában az egyetlen alternatíva figyelembe venni.)

Válaszolt 01/10/2008 06:39
a forrás felhasználó

szavazat
2

A klasszikus megközelítés a következő:

  • adjunk hozzá egy logikai mező, „zárva”, hogy minden asztalnál.
  • állítsa ezt a hamis alapértelmezés szerint.
  • ha a felhasználó elkezdi szerkeszt, akkor ezt:

    • zárja le a sort (vagy az egész asztal, ha nem tudja lezárni a sort)
    • ellenőrizze a zászlót a sor szerkeszteni kívánt
    • Ha a jelző igaz, akkor
      • tájékoztatja a felhasználót, hogy nem lehet szerkeszteni, hogy sor abban a pillanatban
    • más
      • állítsa a zászlót, hogy igaz
    • kioldódjon

    • mentésekor a rekord, meg a zászló vissza false

Válaszolt 01/10/2008 09:53
a forrás felhasználó

szavazat
0

Velem, a legjobb módja nekem van egy oszlop LASTUPDATE (timetamp adattípus). amikor kiválasztják és frissítés csak összehasonlítani ezt az értéket egy másik előre ez a megoldás, akkor használja ezt az oszlopot, hogy nyomára az idő adatot változás. Azt hiszem, ez nem jó, ha csak hozzon létre egy colum mint isLock check frissítés.

Válaszolt 24/06/2011 08:14
a forrás felhasználó

szavazat
1

-első létre benyújtott (update idő) tárolására Utolsó frissítés rekord -amikor minden felhasználó kiválasztásához rekord megtakarítás válasszuk időt, hasonlítson között válasszuk időt és frissítési idő mezőt, ha (update idő)> (válasszon idő) azt jelenti, hogy egy másik felhasználó frissítés ezt a rekordot után válasszuk rekord

Válaszolt 14/07/2016 11:23
a forrás felhasználó

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