Sdílet prostřednictvím


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 EnqueueAsyncse 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í.

Další kroky