sql - Jaká je nejlepší výchozí úroveň izolace transakcí pro ERP, pokud existuje?

Translate

Krátké pozadí: Právě začínáme migrovat / reimplementovat systém ERP do Javy pomocí Hibernate, zaměřujeme se na souběžný počet uživatelů 50-100 uživatelů využívajících tento systém. Jako databázový server používáme MS SQL Server, což je pro toto načtení dost dobré.

Starý systém nyní vůbec nepoužívá žádné transakce a spoléhá se na kritické části (např. Změny stavu zásob), že nastaví manuální zámky (pomocí příznaků) a uvolní je. To je něco jako manuální správa transakcí. Někdy však existují problémy s nekonzistencí dat. V novém systému bychom chtěli pomocí transakcí tyto problémy odstranit.

Nyní otázka: Co by bylo dobré / rozumnévýchozíúroveň izolace transakcí, která se má použít pro systém ERP, při použití přibližně 85% OLTP a 15% OLAP? Nebo bych se měl vždy rozhodnout na základě jednotlivých úkolů, jakou úroveň transakce použít?

A jako připomínka čtyři úrovně izolace transakcí: PŘEČTĚTE NEOMEZENÉ, PŘEČTĚTE SI POVINNÉ, OPAKOVATELNÉ PŘEČTĚTE, SERIALIZOVATELNÉ

This question and all comments follow the "Attribution Required."

Všechny odpovědi

Translate

99krát ze 100, čtení potvrzeno, je správná odpověď. To zajistí, že uvidíte pouze změny, které byly potvrzeny druhou relací (a tedy výsledky, které jsou konzistentní, za předpokladu, že jste své transakce navrhli správně). Ale neukládá uzamykací režii (zejména v databázích jiných než Oracle), kterou ukládá opakovatelné čtení nebo serializace.

Velmi příležitostně můžete chtít spustit report, kde jste ochotni obětovat přesnost rychlosti a nastavit úroveň izolace pro čtení bez závazku. To je zřídka dobrý nápad, ale je občas rozumně přijatelné řešení, jak zamknout spory.

Serializovatelné a opakovatelné čtení se příležitostně používá, když máte proces, který potřebuje vidět konzistentní sadu dat po celou dobu běhu bez ohledu na to, co ostatní transakce právě dělají. Může být vhodné nastavit proces odsouhlasení na konci měsíce na serializovatelný, například pokud existuje mnoho procedurálního kódu, možnost, že uživatelé budou provádět změny, když je proces spuštěn, a požadavek, který proces potřebuje zajistěte, aby vždy viděla data tak, jak existovala v době zahájení odsouhlasení.

Zdroj
Translate

Nezapomeňte na SNAPSHOT, který je přímo pod SERIALIZABLE.

Záleží na tom, jak důležité je, aby údaje byly ve zprávách přesné. Je to opravdu věc od úkolu.

Zdroj
Translate

Opravdu hodně záleží na tom, jak aplikaci navrhnete, snadná odpověď je spuštěna na adrese READ_COMMITTED.

Můžete argumentovat tím, že pokud při navrhování systému berete v úvahu, že můžete použít READ_UNCOMMITTED jako výchozí a zvýšit úroveň izolace, pouze když to potřebujete. Drtivá většina vašich transakcí bude stejně úspěšná, takže čtení nepotvrzených dat nebude velký problém.

Způsob, jakým úrovně izolace ovlivňují vaše dotazy, závisí na vaší cílové databázi. Například databáze jako Sybase a MSSQL musí při spuštění READ_COMMITTED uzamknout více zdrojů než databáze jako Oracle.

Zdroj
Translate

U serveru SQL Server (a pravděpodobně většiny hlavních RDBMS) bych se držel výchozího nastavení. Pro SQL Server je to PŘEČTĚTE POVINNÉ. Cokoli víc a začnete přetížit DB, cokoli méně a máte problémy s konzistencí.

Zdroj
Translate

Read Uncommitted je rozhodně smolař na většině fór. Existují však důvody pro jeho použití, které jdou nad rámec záležitosti „rychlost versus přesnost“, na kterou se často poukazuje.

Řekněme, že máte:

  • Transakce T1: Zápisy B, čtení A, (některé další práce), potvrzení.
  • Transakce T2: Zápisy A, čtení B, (některé další práce), potvrzení.

Při potvrzeném čtení se výše uvedené transakce neuvolní, dokud se nepotvrdí. Pak můžete narazit na situaci, kdy T1 čeká na T2 uvolnění A a T2 čeká na T1 uvolnění B. Zde se tyto dvě transakce srazí v zámku.

Tyto postupy můžete přepsat, abyste se tomuto scénáři vyhnuli (příklad: získávání zdrojů vždy v abecedním pořadí!). Přesto s příliš mnoha souběžnými uživateli a desítkami tisíc řádků kódu se tento problém může stát velmi pravděpodobným i velmi obtížným diagnostikovat a vyřešit.

Alternativou je použití příkazu Uncommitted. Pak navrhnete své transakce za předpokladu, že mohou existovat špinavá čtení. Osobně považuji tento problém za mnohem lokalizovanější a léčitelnější než vzájemně propojené vraky.

Problémy se špinavými čteními lze předcházet

  • (1) Vrácení zpět: ne. To by měla být poslední obranná linie v případě selhání hardwaru, selhání sítě nebo selhání programu.

  • (2) Pomocí aplikačních zámků vytvořte uzamykací mechanismus, který pracuje na vyšší úrovni abstrakce, kde je každý zámek blíže zdroji nebo akci v reálném světě.

Zdroj
Leave a Reply
You must be logged in to post a answer.
O autorovi