Režimy transakcí a zámků 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á jednotka práce. Jinými slovy, buď se provádějí všechny úpravy dat, nebo se neprovádí žá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 správné na konci transakce.
- Izolace: Změny 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 provedení operace.
- Stálost: Po dokončení transakce jsou jeho účinky trvale zavedeny v systému. Změny se uchovávají i v případě selhání systému.
Úrovně izolace
Úroveň izolace definuje stupeň, do kterého musí být transakce izolovaná 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 potvrzena jinými transakcemi a že žádné jiné transakce nemohou upravovat data přečtená aktuální transakcí, dokud aktuální transakce nedokončí.
- Snímek: Určuje, že data přečtená libovolným příkazem v transakci jsou transakční konzistentní verze dat, která existovala na začátku transakce. Transakce dokáže rozpoznat pouze úpravy dat, které byly potvrzeny před zahájením transakce. Změny dat provedené jinými transakcemi po spuštění aktuální transakce nejsou viditelné pro příkazy spuštěné v aktuální transakci. Účinek je, jako kdyby příkazy v transakci získaly snímek potvrzených dat, 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
Reliable Dictionary i Reliable Queue podporují čtení zápisů. Jinými slovy, všechny zápisy v rámci transakce budou viditelné pro následující čtení, které patří do stejné transakce.
Zámky
V Reliable Collections implementují všechny transakce přísné dvoufázové uzamčení: transakce neuvolní zámky, které získal, dokud transakce neukončí s přerušením nebo potvrzením.
Reliable Dictionary používá uzamčení na úrovni řádků pro všechny operace s jednou entitou.
Spolehlivá fronta vymění souběžnost pro striktní vlastnost FIFO transakcí.
Spolehlivá fronta používá zámky na úrovni operací, které umožňují jednu transakci s TryPeekAsync
a/nebo TryDequeueAsync
jednou transakcí EnqueueAsync
současně.
Všimněte si, že pokud chcete zachovat FIFO, pokud TryPeekAsync
nebo TryDequeueAsync
někdy zjistí, že Spolehlivá fronta je prázdná, zamkne EnqueueAsync
se také .
Operace zápisu vždy přebírají výhradní zámky. U operací čtení závisí uzamčení na několika faktorech:
- Jakákoli operace čtení provedená pomocí izolace snímku je bez uzamčení.
- Jakákoli operace opakovatelného čtení ve výchozím nastavení přebírá sdílené zámky.
- U jakékoli operace čtení, která podporuje opakovatelné čtení, ale může uživatel požádat o zámek aktualizace místo sdíleného zámku. Zámek aktualizace je asymetrický zámek, který slouží k zabránění společ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ělena | Nic | Shared | Aktualizovat | Výhradní |
---|---|---|---|---|
Shared | Žádný konflikt | Žádný konflikt | Konflikt | Konflikt |
Aktualizovat | Žádný konflikt | Žádný konflikt | Konflikt | Konflikt |
Výhradní | Žádný konflikt | 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 u nich dojde k zablokování, protože oba skončí se sdíleným zámkem. V takovém případě vyprší časový limit jedné nebo obou operací. V tomto scénáři může zámek aktualizace zabránit takovému vzájemnému zablokování.