Üritan muuta Oracles tabeli struktuuri või tabelit kustutada, kuid saan veateate ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired.

Milles on viga ja kuidas seda lahendada?

Postitas Erki Eessaar, 01.06.2022 00:00
Viga tuleb sellest, et üritate kustutada tabelit, milles olevaid andmeid mõni teine transaktsioon samal ajal muudab. Lisan vastusele seda illustreeriva pildi.

Sessioonis 1 loodi tabel ja lisati sellesse rida. INSERT lausega algas uus transaktsioon. Kuna Oracle ei tööta transaktsioonide automaatse kinnitamise režiimis, siis see transaktsioon kestab seni kuni see lõpetatakse või kestab sessioon, milles transaktsioon algatati. Kui tabelis andmeid muudetakse, siis paneb see tabelile luku, mis ei lase samal ajal tabeli struktuuri muuta või tabelit kustutada. Sellest tuleb sessioonis 2 veateade.

Selline olukord saab tekkida, kui töötate tabelitega mitmekesi - üks muudab andmeid, teine tahab samal ajal neid kustutada.

Lahenduseks on sessioonis 1 transaktsiooni lõpetamine. Transaktsiooni kinnitamiseks on COMMIT lause ja transaktsiooni tühistamiseks ROLLBACK lause. Peale seda võib sessioonis 2 uuesti kustutamist proovida.

Lukustamise näide Oracles
Lukustamise näide Oracles
Täies mahus vaatamiseks klõpsake pildil.

Kas postitus oli kasulik? Hinda seda!

Keskmine hinne: Pole veel hinnanguid!


← Eelmine postitus Käivitasin PostgreSQLis skripti/päringu/andmemuudatuse, mis "jooksis kinni". Nüüd töötab andmebaasisüsteem aeglaselt ning protsess on lukustanud tabeli/vaate/andmebaasi, mille tulemusena ei saa ma seda muuta ega kustutada. Kuidas "rippuma jäänud" PostgreSQL kasutamise sessioonidest ja nendes algatatud ressursse blokeerivates serveriprotsessidest lahti saada? Järgmine postitus → Teatavasti saavad Oracles (12c Release 1.0.1) enamik identifikaatoreid (nt tabelite ja kitsenduste nimed) olla maksimaalselt 30 baidi suurused. Kas on mõni abivahend, mis lihtsustakse andmebaasikeele lausete kirjutamisel selle pikkuse kontrollimist?