Menu

Virtuoso transactions and locking

Petr Jerman

Transakční mechanismy a zamykání dat u Virtuosa

  • testováno posloupnostmi příkazů z Javy (podobně bude platit i pro SQL skripty a procedury)


  • testováno v branch prototype : /prototype/virtuosoaccess-maven/, tvrzení o procedurách otestováno dříve ve WS pro studenty


  • isolation level testovány breakpointy v rozdělaných transakcích kódu a souběžnými dotazy z SQL konzoly Virtuoso WWW conductora


  • čtveřice RDF odpovídá řádku DB tabulky

Řízení transakčního chování pomocí zařazení funkce log_enable(param) do kódu

  • log_enable(2) a log_enable(3) nastavení způsobuje okamžitý commit každé změněné řádky tabulky, revert již pak není možný, toto nastavení má přednost před jdbc nastavením setAutoCommit(false) a je trvalé pro celé spojení do databáze, tyto průběžné modifikace žádné zámky nenastavují


  • log_enable(0) a log_enable(1) nastavení umožňuje normální chování řízené dle jdbc setAutoCommit, přepínaní mezi 0 a 1 nastavením je možné po každé transakci, nastavení 0 dvakrát po sobě vyvolá chybu, v každém případě rozdělaná transakce nastavuje exclusivní zámky při modifikaci, jejich granularita (tabulka - (stránka) - řádek) funguje dobře


  • log_enable(0) a log_enable(2) nastavení způsobuje nezapisování dat do logu, po havárii Virtuosa je možný jen rollback, nikoli dopředný commit dat (upřednostněn výkon před Duration vlastností z ACID)


Řízení isolation level zařazením set isolation="isolation-level" do kódu

  • nastavení repeatableread (default !) and serialize isolation level způsobí čekání na uvolnění exclusivních zámků


  • read commited nezpůsobí čekání na uvolnění exclusivních zámků jelikož Virtuoso od verze 5 používá multiverzování. Inserty a delete nekomitlých transakcí nejsou vidět

pozn.: zápisy na sebe čekají vždy



Další možnosti

  • procedury DB.DBA.TTLP - loading from turtle, DB.DBA.RDF_LOAD_RDFXML jsou vykonány v rámci rodičovských transakcí (insert metadat a rdfxml lze provést jako jednu transakci)


  • lze nastavit transaction_timeout


  • lze ovlivnit výkonnost pro kurzory nastavením eskalací zámků z row na page pomocí LOCK_ESCALATION_PCT funkce


  • Potencionálně perspektivní se mi jeví ještě článek 9.25 Anytime Queries z Virtuoso dokumentace, to jsem však již netestoval