Editace databázové záznamy od více uživatelů

hlasů
23

Navrhl jsem databázové tabulky (normalizované na serveru MS SQL) a vytvořili samostatný okna front-end pro aplikaci, která bude sloužit hrstka uživatelů přidávat a upravovat informace. Budeme-li přidat webové rozhraní umožňující vyhledávání naproti přes naše výrobní prostor k pozdějšímu datu.

Mám obavy, že pokud spustit dva uživatelé úpravy stejný záznam pak poslední spáchat aktualizace by byla ‚vítěz‘ a důležité informace mohou být ztraceny. Řada řešení přijde na mysl, ale nejsem si jistý, jestli budu vytvářet větší bolesti hlavy.

  1. Nedělat nic a doufat, že dva uživatelé se nikdy být úpravy stejný záznam ve stejnou dobu. - Možná nikdy happed, ale co když se to dělá?
  2. Úpravy rutina by mohla uložit kopii původních dat, jakož i aktualizace a pak porovnat, když uživatel dokončil úpravy. V případě, že se liší ukázat uživateli a comfirm aktualizace - by vyžadovalo dvě kopie dat, které mají být uloženy.
  3. Přidejte poslední aktualizace sloupce DATETIME a nechte se shoduje, když jsme aktualizaci, pokud ne, tak ukazují rozdíly. - vyžaduje, aby nový sloupec v každé z příslušných tabulkách.
  4. Vytvořte editační tabulku, která zaznamenává, když uživatelé začít upravovat záznam, který bude kontrolovat a zabránit ostatním uživatelům editaci stejný záznam. - by vyžadovalo carful myšlenka běhu programu, aby se zabránilo zablokování a záznamy stává uzamčen, pokud uživatel zhroucení z programu.

Existují nějaké lepší řešení, nebo mám jít na jeden z nich?

Položena 03/08/2008 v 22:23
zdroj uživatelem
V jiných jazycích...                            


8 odpovědí

hlasů
12

Pokud očekáváte občasné srážky, Optimistický souběžnost je pravděpodobně nejlepší volbou.

Scott Mitchell napsal ucelený návod k provádění tohoto vzoru:
Implementace optimistickou součinnost

Odpovězeno 03/08/2008 v 22:31
zdroj uživatelem

hlasů
2

Klasický postup je následující:

  • Přidání boolean pole, „zamčené“ na každém stole.
  • tato položka nastavena na hodnotu false.
  • když uživatel spustí editace, to vy:

    • uzamknout řádek (nebo celou tabulku, pokud nemůžete uzamknout řádek)
    • zkontrolujte vlajku na řádek, který chcete upravit
    • v případě, že vlajka je pravda, pak
      • informovat uživatele, že nemohou upravit tento řádek v okamžiku
    • jiný
      • nastaven příznak na hodnotu true
    • uvolnit zámek

    • Při ukládání záznamu, nastavit příznak zpět na hodnotu false

Odpovězeno 01/10/2008 v 09:53
zdroj uživatelem

hlasů
1

-první vytvořit podané (čas aktualizace) pro uložení poslední aktualizace záznamu -Když každý uživatel vybrat záznam úspory zvolte dobu, porovnat mezi zvolte čas a aktualizace časové pole if (aktualizace doba použitelnosti)> (vyberte čas), to znamená jiným aktualizaci uživatele Tento záznam po select záznam

Odpovězeno 14/07/2016 v 11:23
zdroj uživatelem

hlasů
1

SELECT FOR UPDATE a jejich ekvivalenty jsou dobré a poskytuje tak držet zámek pro mikroskopické množství času, ale na makroskopické částky (např má uživatel data načtena a není stisknuto ‚zachránit‘ byste měli používat optimistickou součinnost jak je uvedeno výše. (Což vždycky jsem si, že je zavádějící, - to je pesimističtější než ‚last spisovatel vyhrává‘, který je obvykle jedinou další alternativou považovány).

Odpovězeno 01/10/2008 v 06:39
zdroj uživatelem

hlasů
1

Další možností je otestovat, zda hodnoty v záznamu, který se měnící, jsou stále stejné, jako byly při spuštění:

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

(Zobrazí pole customer_nm a uživatel jej změní)

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áte-li přidat nový sloupec do tabulky (a udržovat ji v aktuálním stavu), ale musíte vytvořit více podrobných SQL příkazy a předávat nové a staré pole do uložené procedury.

To má také tu výhodu, že nejsou uzamčení záznamů - protože všichni víme, že záznamy skončí zůstat uzamčeny, když by neměl být ...

Odpovězeno 13/08/2008 v 23:32
zdroj uživatelem

hlasů
1

@ Mark Harrison: SQL Server nepodporuje tuto syntax ( SELECT ... FOR UPDATE).

Ekvivalent SQL Server je SELECTvýrok náznak UPDLOCK.

Viz SQL Server Books Online pro více informací.

Odpovězeno 04/08/2008 v 22:54
zdroj uživatelem

hlasů
0

Se mnou, že nejlepší způsob, jak mám sloupce LASTUPDATE (timetamp datový typ). Při volbě a aktualizovat jen porovnat tuto hodnotu jinou zálohu tohoto řešení je, že můžete použít tento sloupec vystopovat čas dat má změnit. Myslím, že to není dobré, pokud jste právě vytvoření Colum jako isLock pro kontrolu aktualizací.

Odpovězeno 24/06/2011 v 08:14
zdroj uživatelem

hlasů
0

Databáze bude to pro vás. Podívejte se na „vyberte ... pro aktualizaci“, který je určen právě pro tento druh věci. To vám dá uzamčení pro zápis na vybraných řádků, které pak můžete potvrdit nebo vrátit zpět.

Odpovězeno 04/08/2008 v 03:30
zdroj uživatelem

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