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

hromadné shromažďování pomocí pro aktualizaci

Problém je v tom, že se pokoušíte provést načtení přes odevzdání.

Když otevřete My_Data_Cur pomocí for update klauzule, Oracle musí uzamknout každý řádek v My_Data_1 tabulky, než může vrátit jakékoli řádky. Když se commit , Oracle musí uvolnit všechny tyto zámky (zámky vytvořené Oracle nezahrnují transakce). Protože kurzor již nemá zámky, které jste požadovali, Oracle musí kurzor zavřít, protože již nemůže splnit požadavek for update doložka. Druhé načtení proto musí vrátit 0 řádků.

Nejlogičtějším přístupem by téměř vždy bylo odstranění commit a provést celou věc v jediné transakci. Pokud opravdu, opravdu, opravdu potřebujete samostatné transakce, budete muset otevřít a zavřít kurzor pro každou iteraci cyklu. S největší pravděpodobností budete chtít udělat něco, co omezí kurzor tak, aby při každém otevření vrátil pouze 100 řádků (tj. rownum <= 100 klauzule), abyste nemuseli platit náklady na navštěvování každého řádku za účelem umístění zámku a poté každého jiného řádku než těch 100, které jste zpracovali a odstranili, abyste zámek uvolnili pokaždé, když projdete smyčkou.



  1. Získejte vygenerované uuid po vložení php

  2. PHP PDO:jak opětovná příprava příkazu ovlivní výkon

  3. Mysql dotaz pro srovnání cen

  4. Chyba v MySQL při nastavování výchozí hodnoty pro DATE nebo DATETIME