Režimy transakcí a uzamčení ve spolehlivých kolekcích Azure Service Fabric
Transakce
Transakce je posloupnost operací prováděných jako jedna logická jednotka práce. Vykazuje společné vlastnosti ACID (atomicita, konzistence, izolace, stálost) databázových transakcí:
- Atomicita: Transakce musí být atomická pracovní jednotka. Jinými slovy, buď se provedou všechny jeho úpravy dat, nebo se neprovedou žádné z nich.
- Konzistence: Po dokončení musí transakce ponechat všechna data v konzistentním stavu. Všechny interní datové struktury musí být na konci transakce správné.
- Izolace: Úpravy provedené souběžnými transakcemi musí být izolované od úprav provedených jinými souběžnými transakcemi. Úroveň izolace použitá pro operaci v rámci ITransaction je určena IReliableState provádějící operaci.
- Stálost: Po dokončení transakce jsou její účinky v systému trvale na místě. Úpravy přetrvávají i v případě selhání systému.
Úrovně izolace
Úroveň izolace definuje stupeň, do kterého musí být transakce izolována od úprav provedených jinými transakcemi. Spolehlivé kolekce podporují dvě úrovně izolace:
- Opakovatelné čtení: Určuje, že příkazy nemohou číst data, která byla změněna, ale dosud nebyla potvrzena jinými transakcemi, a že žádné jiné transakce nemohou upravovat data, která byla přečtena aktuální transakcí, dokud aktuální transakce nedokončí.
- Snímek: Určuje, že data přečtená libovolným příkazem v transakci jsou transakcí konzistentní verzí dat, která existovala na začátku transakce. Transakce může rozpoznat pouze změny dat, které byly potvrzeny před zahájením transakce. Úpravy dat provedené jinými transakcemi po zahájení aktuální transakce nejsou viditelné pro příkazy spouštěné v aktuální transakci. Efekt je, jako kdyby příkazy v transakci získaly snímek potvrzených dat tak, jak existovaly na začátku transakce. Snímky jsou konzistentní napříč spolehlivými kolekcemi.
Spolehlivé kolekce automaticky zvolí úroveň izolace, která se má použít pro danou operaci čtení v závislosti na operaci a roli repliky v době vytvoření transakce. Následuje tabulka, která znázorňuje výchozí hodnoty úrovně izolace pro operace Reliable Dictionary a Queue.
Operace \ Role | Primární | Sekundární |
---|---|---|
Čtení jedné entity | Opakovatelné čtení | Snímek |
Výčet, počet | Snímek | Snímek |
Poznámka
Mezi běžné příklady operací s jednou entitou patří IReliableDictionary.TryGetValueAsync
, IReliableQueue.TryPeekAsync
.
Spolehlivý slovník i spolehlivá fronta podporují čtení zápisů. Jinými slovy, každý zápis v rámci transakce bude viditelný pro následující čtení, které patří do stejné transakce.
Zámky
Ve spolehlivých kolekcích implementují všechny transakce přísné dvoufázové uzamčení: transakce neuvolní získané zámky, dokud transakce neskončí s přerušením nebo potvrzením.
Reliable Dictionary používá uzamčení na úrovni řádků pro všechny operace s jednou entitou.
Reliable Queue vymění za striktní transakční vlastnost FIFO souběžnost.
Reliable Queue používá zámky na úrovni operací, které umožňují jednu transakci s TryPeekAsync
a/nebo TryDequeueAsync
a jednu transakci s EnqueueAsync
.
Všimněte si, že pro zachování FIFO, pokud TryPeekAsync
TryDequeueAsync
nebo někdy zjistí, že Spolehlivá fronta je prázdná, uzamknou EnqueueAsync
také .
Operace zápisu vždy přebírají výhradní zámky. U operací čtení závisí uzamčení na několika faktorech:
- Všechny operace čtení provedené pomocí izolace snímků jsou bez uzamčení.
- Každá opakovatelná operace čtení ve výchozím nastavení přebírá sdílené zámky.
- Pro každou operaci čtení, která podporuje opakovatelné čtení, ale uživatel může místo sdíleného zámku požádat o zámek aktualizace. Zámek aktualizace je asymetrický zámek, který se používá k zabránění běžné formě zablokování, ke kterému dochází, když více transakcí uzamkne prostředky pro potenciální aktualizace později.
Matici kompatibility zámků najdete v následující tabulce:
Žádost \ Uděleno | Žádné | Shared | Aktualizace | Exkluzivní |
---|---|---|---|---|
Shared | Bez konfliktu | Bez konfliktu | Konflikt | Konflikt |
Aktualizace | Bez konfliktu | Bez konfliktu | Konflikt | Konflikt |
Exkluzivní | Bez konfliktu | Konflikt | Konflikt | Konflikt |
Argument časového limitu v rozhraních API Reliable Collections se používá k detekci vzájemného zablokování. Například dvě transakce (T1 a T2) se snaží přečíst a aktualizovat K1. Je možné, že dojde k vzájemnému zablokování, protože oba mají sdílený zámek. V takovém případě vyprší časový limit jedné nebo obou operací. V tomto scénáři může takovému zablokování zabránit zámek aktualizace.
Další kroky
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro