Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
1. Zamykkové mechanizmy:
* Exkluzívne zámky (zámky zámkov): Keď chce transakcia aktualizovať riadok, získa v tomto riadku exkluzívny zámok. Žiadna iná transakcia nemôže v tomto riadku získať žiadny druh zámku (čítať alebo zápis), kým sa nevydá exkluzívny zámok. To zaisťuje, že iba jedna transakcia môže riadok upraviť v ktoromkoľvek danom čase.
* zdieľané zámky (čítanie zámkov): Keď chce transakcia prečítať riadok, získa v tomto riadku zdieľaný zámok. Viaceré transakcie môžu držať zdieľané zámky v rovnakom riadku súčasne. Žiadna transakcia však nemôže získať exkluzívny zámok, zatiaľ čo v tomto riadku sú držané zdieľané zámky. To bráni autorom zasahovať do čitateľov.
* Zamknutá granularita: Úroveň, na ktorej sa zámky používajú (napr. Na úrovni riadkov, úrovne stránky, na úrovni tabuľky, na úrovni databázy) ovplyvňuje súbežnosť a výkon. Jemnejšie uzamknutie (napr. Na úrovni riadkov) umožňuje väčšiu súbežnosť, ale má vyššie réžia, zatiaľ čo hrubšie zrnité uzamknutie (napr. Na úrovni tabuľky) znižuje režijné náklady, ale obmedzuje súbežnosť.
2. Protokoly kontroly súbežnej kontroly:
* dvojfázové blokovanie (2PL): Protokol o kontrole súbežnej kontroly, ktorý zaručuje serializovateľnosť (a tak zabraňuje strateným aktualizáciám). Má dve fázy:
* Fáza pestovania: Transakcia môže získať zámky, ale nemôže ich uvoľniť.
* zmenšujúca fáza: Transakcia môže uvoľniť zámky, ale nemôže získať nové.
Prísne dvojfázové blokovanie (prísne 2PL) obsahuje všetky exkluzívne zámky až do konca transakcie (spáchanie alebo vrátenie). Tým sa zabráni kaskádovým spätným valckám (kde zlyhanie jednej transakcie môže prinútiť návrat ostatných).
* Objednávanie časovej pečiatky (do): Každej transakcii je priradená jedinečná časová pečiatka. Systém používa tieto časové pečiatky na zabezpečenie toho, aby sa konfliktné operácie vykonávali v poradí ich časových pečiatok. Ak sa transakcia pokúša napísať hodnotu, ktorá už bola prepísaná transakciou s neskoršou časovou pečiatkou, zápis je zamietnutý a transakcia sa vráti späť. Tento prístup sa vyhýba patovi, ale môže viesť k hladovaniu.
* Optimistické riadenie súbežnosti (OCC): Transakcie postupujú bez získania zámkov. Predtým, ako sa transakcia dopustí, skontroluje, či nejaká iná transakcia upravila údaje, ktoré čítal. Ak existujú konflikty, transakcia sa vráti späť. OCC je vhodný pre situácie s nízkym sporom, pretože spätné väzby môžu byť nákladné. Zvyčajne má tri fázy:
* čítať fázu: Transakcia číta údaje a ukladá ich do miestneho pracovného priestoru.
* Fáza validácie: Systém kontroluje, či sa niektoré z údajov, ktoré čítanie transakcií upravilo inou transakciou od jeho čítania.
* Fáza zápis: Ak je validácia úspešná, zmeny sa uplatňujú na databázu. V opačnom prípade sa transakcia vráti späť.
3. Pomocou transakcií:
* Vlastnosti kyseliny: Vždy používajte transakcie a zabezpečte, aby váš databázový systém presadzoval vlastnosti kyselín (atóm, konzistentnosť, izolácia, trvanlivosť). Vlastnosť „izolácia“ je rozhodujúca pre zabránenie strateným aktualizáciám.
* Transakčné úrovne izolácie: Databázy SQL ponúkajú rôzne úrovne izolácie (napr. Čítané nezúčastnené, čítané, opakované čítanie, serializovateľné). Vyššie úrovne izolácie (napr. Serializovateľné) poskytujú silnejšie záruky proti problémom so súbežnosťou, ako sú stratené aktualizácie, ale môžu znížiť súbežnosť a výkon. Starostlivo vyberte príslušnú úroveň izolácie pre potreby vašej aplikácie. „Serializovateľný“ je najvýznamnejší a najbezpečnejší, ale potenciálne najpomalší. `Čítanie spáchaného“ je spoločné predvolené a poskytuje primeranú ochranu.
4. Logika na úrovni aplikácie:
* Atomické operácie (porovnaj a vymení): Niektoré databázové systémy a programovacie jazyky poskytujú atómové operácie, ktoré možno použiť na vykonávanie operácií na čítanie modify a písania v jednom, nedeliteľnom kroku. Napríklad operácia „Porovnať a Swap“ (CAS) môže atómovo aktualizovať hodnotu, iba ak jej aktuálna hodnota zodpovedá zadanej očakávanej hodnote. Tento prístup sa môže v niektorých prípadoch vyhnúť potrebe explicitných zámkov.
* Verzia/optimistické uzamknutie v aplikácii: Aplikácia môže do údajov, ktoré číta, obsahuje číslo verzie (alebo časová pečiatka). Pri aktualizácii údajov aplikácia obsahuje pôvodné číslo verzie. Databáza potom aktualizuje riadok iba vtedy, ak sa číslo verzie zhoduje s aktuálnym číslom verzie v databáze. Ak sa čísla verzií nezhodujú, aktualizácia je zamietnutá a aplikácia musí aktualizovať. Toto je ďalšia implementácia optimistickej stratégie kontroly súbežnosti.
* Úvahy o obchodnej logike: Prečítajte si obchodnú logiku a zistite, či existujú spôsoby, ako sa úplne vyhnúť operáciám čítania a plova. Dokážete prepracovať dátový model alebo proces, aby ste sa vyhli potenciálu stratených aktualizácií?
5. Dizajn databázy:
* normalizácia: Správne normalizovaná databáza pomáha znižovať redundanciu údajov a zlepšovať konzistentnosť údajov, čo môže nepriamo pomôcť predchádzať problémom so súbežnosťou.
* Vhodné typy údajov: Použitie vhodných typov údajov pre vaše údaje môže pomôcť predchádzať chybám a zlepšiť výkon, čo môže nepriamo pomôcť predchádzať problémom so súbežnosťou.
Príklad scenára a riešenia:
Predstavte si dvaja používatelia, ktorí sa snažia aktualizovať množstvo produktu v tabuľke inventára.
* Užívateľ A: Číta množstvo (napr. 10). Používateľ A chce predať 2, takže vypočíta nové množstvo ako 8.
* User B: Číta množstvo (napr. 10). Používateľ B chce predať 3, takže vypočíta nové množstvo ako 7.
* Užívateľ A: Zapisuje nové množstvo (8) do databázy.
* User B: Zapisuje nové množstvo (7) do databázy.
Konečné množstvo v databáze je 7, ale malo by to byť 5 (10 - 2 - 3). Aktualizácia používateľa A bola stratená.
Tu je niekoľko riešení pre tento scenár:
* Exkluzívny zámok: Ak niektorý z používateľov prečíta množstvo aktualizácie, získajte v riadku produktu exkluzívny zámok. Druhý používateľ musí počkať, kým sa zámok vydá pred prečítaním a aktualizáciou.
* Serializovateľná úroveň izolácie: Nastavte úroveň izolácie transakcie na serializáciu. To zaisťuje, že tieto dve transakcie sú účinne serializované, čo im bráni v vzájomnom zasahovaní.
* Optimistické zamykanie (s číslom verzie):
1. Keď používateľ A prečíta množstvo (10), prečítajú tiež číslo verzie (napr. 1).
2. Používateľ A vypočíta nové množstvo (8) a obsahuje pôvodné číslo verzie (1) do príkazu Update.
3. Databáza aktualizuje množstvo iba vtedy, ak je aktuálne číslo verzie stále 1. Príkaz UPDATE tiež zvyšuje číslo verzie (napr. Až 2).
4. Ak sa User B pokúsi aktualizovať, keď sa už zaviazal používateľ A, aktualizácia používateľa B zlyhá (pretože číslo verzie je teraz 2) a budú musieť údaje znova prečítať a opakovať aktualizáciu.
* Atomická operácia prírastkov/pokles: Ak je k dispozícii, použite databázovo špecifickú operáciu atómového prírastku/poklesu. Napríklad:`Aktualizácia inventára set Movie =Movie-2, kde produkt_id =x` Tento prístup sa vyhýba sekvencii čítania modify a písania.
Výber správneho prístupu:
Najlepší prístup na zabránenie strateným aktualizáciám závisí od niekoľkých faktorov vrátane:
* Úroveň súbežnosti: Ako často sa aktualizácie vykonávajú na rovnaké údaje?
* Požiadavky na výkon: Aká je prijateľná réžia pre kontrolu súbežnosti?
* Databázové schopnosti: Aké mechanizmy kontroly súbežnosti podporujú databáza?
* Zložitosť aplikácie: Aká zložitá je logika aplikácie a ako ľahko sa dá zmeniť?
Starostlivé zváženie týchto faktorov vám pomôže zvoliť najúčinnejšie riešenie pre vašu konkrétnu situáciu. Použitie kombinácie techník je často najúčinnejšou stratégiou. Napríklad použitie transakcií s vhodnou úrovňou izolácie v spojení s optimistickým uzamknutím na úrovni aplikácie.