Transakční zpracování

Jak omezit transakční zpracování např. při importu velkých XML

Lenka Haringerová avatar
Autor: Lenka Haringerová
Aktualizováno před více než týdnem

Tato stránka popisuje pokročilou variantu XML importu, která při nevhodném použití může vést k nekonsistenci dat!

Ve výchozím nastavení se každý import provádí jako jedna databázová transakce – tedy buď se uloží všechno nebo nic.

To je obvykle požadované chování a většinou není důvod na něm něco měnit. Může ovšem nastat situace, kdy transakční chování není nutné, pak lze atributem atomic toto chování změnit.

<?xml version="1.0"?>
<winstrom version="1.0" atomic="false">
<faktura-vydana>
<id>code:123</id> ...
<polozkyFaktury>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
</polozkyFaktury>
</faktura-vydana>
<faktura-vydana>
<id>code:456</id> ...
<polozkyFaktury>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
<faktura-vydana-polozka>...</faktura-vydana-polozka>
</polozkyFaktury>
</faktura-vydana>
</winstrom>

Pokud nastavíte atribut atomic na hodnotu false, importuje se každý záznam v samostatné transakci. Tedy v příkladu výše proběhnou dvě databázové transakce, jedna pro fakturu 123, druhá pro fakturu 456. Položky jsou součástí faktury a tedy se importují ve stejné transakci, jako faktura samotná.

Jaký to přináší užitek? Když importujete velká XML s mnoha záznamy, transakce trvá dlouho a mnoho informací se musí držet v paměti. Obojí má nepříznivý vliv na výkon. Pokud je ale každý záznam samostatný a nevadí, že uložení některého z nich selže (např. když import pravidelně opakujete a/nebo dokážete v případě problémů zasáhnout ručně), můžete podstatně snížit paměťovou náročnost importu.

V případě opravdu velkých importů jsou paměťové nároky pro uchování ještě neuložených dat tak velké, že podstatnou část procesorového času začne zabírat garbage collector (to lze sledovat např. nástrojem jconsole, který je standardní součástí vývojového prostředí JDK). V módu atomic="false" se v takovém případě může razantně snížit i náročnost časová.

Dostali jste odpověď na svou otázku?