Optimistisk samtidighetskontroll
Optimistisk samtidighetskontroll ( OCC ), även känd som optimistisk låsning , är en metod för samtidighetskontroll som tillämpas på transaktionssystem som hanteringssystem för relationsdatabas och transaktionsminne för programvara . OCC antar att flera transaktioner ofta kan genomföras utan att störa varandra. Under körning använder transaktioner dataresurser utan att låsa dessa resurser. Innan den genomförs verifierar varje transaktion att ingen annan transaktion har ändrat den information den har läst. Om kontrollen avslöjar motstridiga ändringar, rullar den genomförande transaktionen tillbaka och kan startas om. Optimistisk samtidighetskontroll föreslogs först av HT Kung och John T. Robinson.
OCC används vanligtvis i miljöer med låg datakonflikt . När konflikter är sällsynta kan transaktioner slutföras utan kostnaden för att hantera lås och utan att transaktioner väntar på att andra transaktioners låsningar ska rensas, vilket leder till högre genomströmning än andra metoder för samtidighetskontroll. Men om konflikten om dataresurser är frekvent, skadar kostnaden för att upprepade gånger omstarta transaktioner prestandan avsevärt, i vilket fall andra för samtidighetskontroll kan vara bättre lämpade. Låsningsbaserade ("pessimistiska") metoder kan emellertid också ge dålig prestanda eftersom låsning drastiskt kan begränsa effektiv samtidighet även när dödlägen undviks.
Faser av optimistisk samtidighetskontroll
Optimistiska transaktioner för samtidighetskontroll involverar dessa faser:
- Börja : Spela in en tidsstämpel som markerar transaktionens början.
- Ändra : Läs databasvärden och skriv preliminärt ändringar.
- Validera : Kontrollera om andra transaktioner har modifierade data som denna transaktion har använt (läst eller skrivit). Detta inkluderar transaktioner som slutförts efter denna transaktions starttid, och eventuellt transaktioner som fortfarande är aktiva vid valideringstillfället.
- Commit/Rollback : Om det inte finns någon konflikt, låt alla ändringar träda i kraft. Om det finns en konflikt, lös den, vanligtvis genom att avbryta transaktionen, även om andra lösningssystem är möjliga. Försiktighet måste iakttas för att undvika en tid-för-kontroll till tid-för-användning bugg, särskilt om denna fas och den föregående inte utförs som en enda atomär operation.
Webbenvändning
HTTPs tillståndslösa karaktär gör låsning omöjlig för webbanvändargränssnitt . Det är vanligt att en användare börjar redigera en post och sedan lämnar utan att följa en "avbryt" eller "logga ut"-länk. Om låsning används måste andra användare som försöker redigera samma post vänta tills den första användarens låsning går ut.
HTTP tillhandahåller en form av inbyggd OCC. Svaret på en initial GET-förfrågan kan inkludera en ETag för efterföljande PUT-förfrågningar att använda i If-Match-huvudet. Alla PUT-förfrågningar med en inaktuell ETag i If-Match-huvudet kan sedan avvisas.
Vissa databashanteringssystem erbjuder OCC inbyggt, utan att kräva speciell applikationskod. För andra kan applikationen implementera ett OCC-lager utanför databasen och undvika att vänta eller tyst skriva över poster. I sådana fall formuläret innehålla ett dolt fält med postens ursprungliga innehåll, en tidsstämpel, ett sekvensnummer eller en ogenomskinlig token. Vid inlämning jämförs detta med databasen. Om den skiljer sig anropas konfliktlösningsalgoritmen.
Exempel
- MediaWikis redigeringssidor använder OCC.
- Bugzilla använder OCC; redigeringskonflikter kallas "krockar i luften".
- Ruby on Rails -ramverket har ett API för OCC.
- Grails - ramverket använder OCC i sina standardkonventioner.
- GT.M - databasmotorn använder OCC för att hantera transaktioner (även enstaka uppdateringar behandlas som minitransaktioner).
- Microsofts Entity Framework (inklusive Code-First) har inbyggt stöd för OCC baserat på ett binärt tidsstämpelvärde .
- Mimer SQL är ett DBMS som endast implementerar optimistisk samtidighetskontroll.
- Google App Engines datalager använder OCC.
- Apache Solr stöder OCC via fältet _version_.
- Sökmotorn Elasticsearch stöder OCC via versionsattributet.
- CouchDB implementerar OCC genom dokumentrevideringar.
- MonetDB kolumnorienterade databashanteringssystems transaktionshanteringsschema är baserat på OCC .
- De flesta implementeringar av transaktionsminne för programvara använder OCC. [ citat behövs ]
- Redis tillhandahåller OCC genom WATCH-kommando.
- Firebird använder flergenerationsarkitektur som en implementering av OCC för datahantering. [ citat behövs ]
- DynamoDB använder villkorlig uppdatering som en implementering av OCC.
- Kubernetes använder OCC vid uppdatering av resurser.
- YugabyteDB är en molnbaserad databas som främst använder OCC.
Se även
externa länkar
- Kung, HT; John T. Robinson (juni 1981). "Om optimistiska metoder för samtidighetskontroll". ACM-transaktioner på databassystem . 6 (2): 213–226. CiteSeerX 10.1.1.101.8988 . doi : 10.1145/319566.319567 .
- Enterprise JavaBeans, 3.0, av Bill Burke, Richard Monson-Haefel, kapitel 16. Transaktioner, avsnitt 16.3.5. Optimistic Locking, Utgivare: O'Reilly, Publikationsdatum: 16 maj 2006, Skriv ut ISBN 0-596-00978-X ,
-
Hollmann, Andreas (maj 2009). "Multi-isolering: Dygder och begränsningar" (PDF) . Multi-Isolation (vad är mellan pessimistisk och optimistisk låsning) . 01069 Gutzkovstr. 30/F301.2, Dresden: Happy-Guys Software GbR. sid. 8 . Hämtad 2013-05-16 .
{{ citera konferens }}
: CS1 underhåll: plats ( länk ) [ permanent död länk ]