Sdílet prostřednictvím


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 TryPeekAsyncTryDequeueAsync nebo někdy zjistí, že Spolehlivá fronta je prázdná, uzamknou EnqueueAsynctaké .

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