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

Prodleva Oracle mezi potvrzením a výběrem

Ve výchozím nastavení by chování, které jste popsali, mělo být nemožné – změny provedené v potvrzené transakci budou okamžitě dostupné všem relacím. Existují však výjimky:

  1. Používáte některou z možností WRITE v příkazu COMMIT? Pokud nejste, potvrďte hodnotu svého inicializačního parametru COMMIT_WRITE. Pokud buď používáte "WRITE BATCH" nebo zejména "WRITE BATCH NOWAIT", můžete se otevřít problémům souběžnosti. "WRITE BATCH NOWAIT" se obvykle používá v případech, kdy je rychlost vašich transakcí zápisu důležitější než možné problémy se souběžností. Pokud váš inicializační parametr používá varianty „WRITE“, můžete jej přepsat na základě transakce zadáním klauzule IMMEDIATE ve vašich potvrzeních (viz COMMIT)

  2. Vyvolává transakce, která se pokouší číst data, SET TRANSACTION před potvrzením jiné transakce? Použití SET TRANSACTION k určení SERIALIZACE ÚROVNĚ ČTĚTE POUZE nebo SERIALIZAČNÍ bude mít za následek, že transakce nezaznamená žádné změny, ke kterým došlo z jiných potvrzených relací, ke kterým došlo po vyvolání SET TRANSACTION (viz SET TRANSACTION)

edit:Vidím, že používáte třídu DataSource. Nejsem obeznámen s touto třídou - předpokládám, že je to prostředek pro sdílení připojení. Uvědomuji si, že váš současný návrh aplikace nemusí usnadňovat používání stejného objektu připojení v průběhu vašeho pracovního postupu (kroky mohou být navrženy tak, aby fungovaly nezávisle, a nezabudovali jste zařízení pro předávání objektu připojení z jednoho kroku do další), ale měli byste ověřit, že objekty připojení vracené do objektu DataSource jsou „čisté“, zejména s ohledem na otevřené transakce. Je možné, že ve svém kódu nevyvoláváte SET TRANSACTION, ale jiný spotřebitel DataSource jinde to může dělat a vracet připojení zpět ke zdroji dat s relací stále v režimu SERIALIZABLE nebo READ ONLY. Při sdílení připojení je nezbytné, aby byla všechna připojení před předáním novému spotřebiteli zrušena.

Pokud nemáte žádnou kontrolu nebo přehled o chování třídy DataSource, můžete zkusit provést ROLLBACK na nově získaném připojení, abyste se ujistili, že již není vytvořena žádná přetrvávající transakce.



  1. SQL:velké pouze první písmeno

  2. Porovnejte data v MySQL

  3. ORA-00979 není skupina podle výrazu

  4. Uzavřete řetězce do jednoduchých uvozovek ve výsledcích dotazu SQLite