sql >> Databáze >  >> RDS >> Oracle

Jsou explicitní potvrzení v pořádku, když je automatické potvrzení zapnuté?

Potvrzení uvnitř smyčky je obecně špatný nápad (stejně jako povolit automatické potvrzení jakéhokoli nástroje).

Zavázání uvnitř smyčky značně ztěžuje zápis restartovatelného kódu. Co se stane, když po 3 iteracích narazíte na chybu? Nyní jste úspěšně potvrdili výsledky 2 UPDATE prohlášení. Pravděpodobně byste pak museli buď zjistit, které řádky byly aktualizovány, a napsat kód, aby se aktualizace zvrátily, nebo byste museli přidat kód, který zabrání pokusům o aktualizaci dat pro tyto dva úspěšné yearid hodnoty. To je jistě možné. Ale vyžaduje to napsání hromady kódu pro sledování vašeho pokroku a obecně to dělá váš kód mnohem složitějším.

Potvrzení uvnitř smyčky váš kód mnohem zpomalí. Zavazování je obecně poměrně nákladná operace. Dělat to ve smyčce je proto obecně špatný nápad. Je to menší problém, pokud máte jen několik desítek opakování smyček. Ale pokud máte stovky nebo tisíce iterací, můžete snadno strávit drtivou většinu svého času zavazováním.

Zavázání uvnitř smyčky podstatně zvyšuje riziko, že způsobíte chybu ORA-01555. Váš dotaz proti MyTable potřebuje číst konzistentní pohled na data. Pokud však provedete potvrzení uvnitř smyčky, říkáte Oracle, že vaše relace již nepotřebuje starší UNDO data. Pokud Oracle náhodou vyčistí UNDO data, která potřebujete pro následnou iteraci smyčky, dostanete chybu. A pak se zase zabýváte nerestartovatelným kódem, kde jste úspěšně prošli N iterací, ale nevíte, které roky byly zpracovány nebo které je třeba zpracovat.

Zavázání se uvnitř smyčky může způsobit problémy s konzistencí dat. Pokud například nějaká jiná relace spouští přehledy, je pro tyto přehledy snadné vidět částečně aktualizovaná data, což často znamená, že data budou nekonzistentní. Pokud se data za 3 roky změnila, ale jiné roky ne, může být velmi obtížné porozumět zprávám a lidé (nebo procesy) mohou snadno učinit nesprávná rozhodnutí.

Potvrzení uvnitř smyčky také činí váš kód méně znovupoužitelným. Pokud váš kód obsahuje potvrzení (nebo vrácení zpět do jiného bodu než do bodu uložení, který jste vytvořili uvnitř bloku), nemůže být volán žádným jiným kódem, který si nepřeje, aby byla jeho transakce ještě potvrzena. To vede lidi ke snaze znovu implementovat vaši logiku bez kontroly transakcí nebo k nesprávnému porušení transakční integrity, což je nevyhnutelně vede k vytváření aplikací, které zavádějí problémy s konzistencí dat.



  1. Spring boot – nastavení MySQL nefungují

  2. Průměrný počet příspěvků za hodinu na MySQL?

  3. Vyberte odlišné hodnoty na základě sloupce s maximální hodnotou data z druhého sloupce

  4. MySQL LIKE %string% není dostatečně shovívavé. Mohu ještě něco použít?