abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 04:00 | Nová verze

    raylib (Wikipedie), tj. multiplatformní open-source knihovna pro vývoj grafických aplikací a her, byla vydána ve verzi 6.0.

    Ladislav Hagara | Komentářů: 0
    24.4. 18:33 | IT novinky

    Nové verze AI modelů. Společnost OpenAI představila GPT‑5.5. Společnost DeepSeek představila DeepSeek V4.

    Ladislav Hagara | Komentářů: 0
    24.4. 15:33 | Zajímavý článek

    Nová čísla časopisů od nakladatelství Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 164 (pdf) a Hello World 29 (pdf).

    Ladislav Hagara | Komentářů: 0
    24.4. 04:44 | Komunita

    Bylo oznámeno, že webový prohlížeč Opera GX zaměřený na hráče počítačových her je už také na Flathubu and Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    23.4. 23:11 | IT novinky

    Akcionáři americké mediální společnosti Warner Bros. Discovery dnes schválili převzetí firmy konkurentem Paramount Skydance za zhruba 110 miliard dolarů (téměř 2,3 bilionu Kč). Firmy se na spojení dohodly v únoru. O část společnosti Warner Bros. Discovery dříve usilovala rovněž streamovací platforma Netflix, se svou nabídkou však neuspěla. Transakci ještě budou schvalovat regulační orgány, a to nejen ve Spojených státech, ale také

    … více »
    Ladislav Hagara | Komentářů: 0
    23.4. 22:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 26.04 LTS Resolute Raccoon. Přehled novinek v poznámkách k vydání. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 11. vydání s dlouhodobou podporou (LTS).

    Ladislav Hagara | Komentářů: 2
    23.4. 11:55 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Gitea (Wikipedie) byla vydána v nové verzi 1.26.0. Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    23.4. 04:44 | Pozvánky

    Ve středu 29. dubna 2026 se v pražské kanceláři SUSE v Karlíně uskuteční 7. Mobile Linux Hackday, komunitní setkání zaměřené na Linux na mobilních zařízeních, kernelový vývoj i uživatelský prostor. Akce proběhne od 10:00 do večerních hodin. Hackday je určen všem zájemcům o praktickou práci s Linuxem na telefonech. Zaměří se na vývoj aplikací v userspace, například bankovní aplikace, zpracování obrazu z kamery nebo práci s NFC, i na úpravy

    … více »
    lkocman | Komentářů: 1
    22.4. 21:55 | Nová verze

    LilyPond (Wikipedie) , tj. multiplatformní svobodný software určený pro sazbu notových zápisů, byl vydán ve verzi 2.26.0. Přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    22.4. 20:33 | Nová verze

    Byla vydána nová verze 11.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 237 vývojářů. Provedeno bylo více než 2 500 commitů. Přehled úprav a nových vlastností v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (2%)
     (13%)
     (31%)
     (3%)
     (6%)
     (2%)
     (15%)
     (25%)
    Celkem 1421 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Dotaz: Může v postgresql být smazán řádek z ještě nepřečtené result set?

    3.3.2015 14:37 kalik
    Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Přečteno: 1078×
    Ahoj.

    V php pomocí PDO si připravím SELECT dotaz, spustím ho a pak postupně procházím jednotlivé řádky pomocí foreach s tím, že v každém cyklu si fetchnu jeden řádek. Zjistil jsem, že i když po spuštění SELECT dotazu smažu některé řádky, které jsem ještě nestačil fetchnout, tak stejně se takové řádky ve výsledku objeví i když už jsou fyzicky smazané.

    Jak je to možné? Nějaká cache? Mám záruku, že to tak bude pořád? Rád bych si napsal iterátor třídu pro procházení obrovského množství řádků, abych ušetřil paměť. Bude i v případě procházení milionů řádků result set "imunní" než ho stačím celý fetchnout?

    Odpovědi

    3.3.2015 15:36 Ivan
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    MVCC
    3.3.2015 16:26 kalik
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Aha, děkuji. Já jsem myslel, že toto funguje jen když čtu data ovlivněná jinou transakcí. Ovlivňuje toto chování i nastavení úrovně izolace "SET SESSION CHARACTERISTIC"?
    3.3.2015 19:40 Ivan
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    IMHO Izolacni uroven uvlivnuje to co uvidite to co "vidite" mezi jednotlivymi SELECTy. Kazdy jednotlivy dotaz by mel vracet konzistentni pohled na data, to by jinak bylo dost nedeterminsticke.
    3.3.2015 16:48 Filip Jirsák
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Chování záleží na tom, jak máte nastavenu izolaci transakcí. Když použijete repeatable read, uvidíte v rámci jedné transakce vždy stav, který byl na začátku transakce – takže jiné transakce mohou mazat nebo insertovat, a váš result set to neovlivní.

    Procházením obrovského množství řádků paměť neušetříte, právě naopak. Server si nějakým způsobem tu výslednou sadu pamatovat musí – ať už přímo jako výsledek, nebo jako zdrojová data, ze kterých ten výsledek dokáže sestavit.
    3.3.2015 18:32 kalik
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Jako výchozí jsem nastavil SERIALIZABLE. Nicméně ten SELECT nebyl spuštěný v transakci a stejně to výsledný result set neovlivnilo. Nebo to postgresql bere tak, že každý dotaz je vlastně transakce?
    3.3.2015 19:04 Filip Jirsák
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Nicméně ten SELECT nebyl spuštěný v transakci
    Byl. V PostgreSQL (a v každém jiném rozumném systému s podporou transakcí) dotaz mimo transakci nespustíte.
    Nebo to postgresql bere tak, že každý dotaz je vlastně transakce?
    Transakce se zahájí automaticky. Pravděpodobně máte v PDO nastavený autocommit, takže se pak každý příkaz provádí v samostatné transakci.
    4.3.2015 10:15 Kit | skóre: 46 | Brno
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    ... Pravděpodobně máte v PDO nastavený autocommit, takže se pak každý příkaz provádí v samostatné transakci.
    Autocommit přece s PDO nesouvisí. Není to vlastnost databázového klienta, ale serveru.
    Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
    4.3.2015 18:11 Filip Jirsák
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Autocommit je vždy možné konfigurovat z klienta. To, zda je implementován na serveru, nebo tak, že klient po každém příkazu pošle commit, je podle mne implementační detail. Konkrétně v případě PostgreSQL podle mne server nic takového neumí a autocommit je vždy záležitostí implementace klienta.
    4.3.2015 18:15 Filip Jirsák
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Aha, tak ne, omlouvám se - implicitně zahájená transakce je po úspěšném provedení také commitnuta, takže pokud se nezahájí transakce explicitně BEGIN, funguje to jako autocommit.
    5.3.2015 10:35 Marek
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Tazatel chce zrejme setrit pamet u klienta, ne u serveru.
    5.3.2015 12:57 j
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    "Zjistil jsem, že i když po spuštění SELECT dotazu smažu některé řádky, které jsem ještě nestačil fetchnout, tak stejně se takové řádky ve výsledku objeví i když už jsou fyzicky smazané."

    Pomerne logicky, nemyslis? Select ti vrati data do nejakyho bufferu a ty uz pri foreach nepracujes s datama v databazi, ale s datama v tom vracenym vysledku.

    SERIALIZABLE ti na to nepomuze, jakmile select dobehne, tak pokud neotevres explicitne transakci a nenechasi ji viset po celou dobu prochazeni vysledku, tak se okamzite ukonci.

    Pokud nactes milion radku, a nemas na to dost RAM, tak ti to proste zbuchne. Takova prace s databazi je ovsem ponekud knicemu. Protoze ty si stavis dalsi, zcela nesmyslnou vrstvu nad tou databazi.
    5.3.2015 13:16 Ivan
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Tenhle prece neni o najakych bufferech. PostgreSQL uklada kazdou zmenenou radku na nove misto(a ma i poiter na predchozi verzi stavu te radky). O uklid se stara VACUUM. Takze kdyz sql select nacte block s radkou, ktera ma novejsi timestamp, nez je zacatek transakce tak se proste podiva na predchozi stav te radky.

    To je princip implementace MVCC, do databaze se ukladaji vsechny predchozi stavy dat, ktere jsou jeste potreba.
    5.3.2015 13:50 Filip Jirsák
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    MVCC je způsob implementace v PostgreSQL. Pro tazatele je ale důležité, že přesně tohle řeší různé úrovně izolace transakcí – a to, jak databáze tu úroveň izolace zařídí, je implementační detail. Zároveň je potřeba vědět, že izolaci transakcí sice definuje standard, ale je to dost všeobecné – a jaké skutečně dává která úroveň záruky, to se dozví jedině z dokumentace konkrétní databáze.
    5.3.2015 16:42 kalik
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Chápu to dobře, že po begin transaction mám až do commitu pohled na data konstantní, jako byl před zahájením transakce? Tzn. začnu transakci, provedu select z jedné tabulky, pak nesouvisející select z druhé atd. a mám jistotu, že ta data jsou pořád pro mě zevnitř transakce nezměněná jako před začátkem transakce?
    5.3.2015 16:55 Filip Jirsák
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    To platí jen v případě, že máte úroveň oddělení transakcí alespoň repeatable read. Pokud použijete read committed (v PostgreSQL je výchozí) nebo read uncommited (v jiné databázi, PostgreSQL to neumí), a spustíte v jedné transakci dvakrát za sebou stejný select, může dát pokaždé jiné výsledky, pokud podkladovou tabulku mezi tím změnila jiná transakce. Když použijete repeatable read, vidíte tabulky ve stavu, v jakém byly na začátku transakce (plus samozřejmě změny provedené aktuální transakcí).
    25.3.2015 17:10 michal00 | skóre: 14 | blog: OpenStreetMap
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    toto s transakciami nemá nič. result je uložený v buffery PHP, pri volaní pg_fetch_assoc to zbehne z toho resultu. aj keď sql server už nebeží, zmazala sa tabuľka, zmazali sa dáta. v tom čase sa vôbec nepýta sql server, všetko je vnútri php.

    rovnako ako keď v psql zbehnem query a potom ju iba pozerám v pageri. medzitým kľudne môžem zformátovať disk s databázou a psql si nič nevšimne (feature, nie bug).
    25.3.2015 21:37 Ivan
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    A ten buffer ma nekonecnou velikost? To asi ne. Aplikace a databaze pracuji na principu producent-konzument. Tzn. v okamziku kdy se blizite k konci bufferu klient poste do databaze pozadavek dalsi davku dat. Proto je pro databazi dulezite pamatovat si timestamp okamziku kdy se zacal dotaz provadet, potom muze databaze zpracovavat pouze bloky, ktere byly modifikovane pred tim timestamp-em. Ono to jen "vypada", ze se dotaz vykonal v jeden okamzik.
    okbob avatar 25.3.2015 23:21 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Ono je to trochu složitější - Postgres, pokud se nepoužívají kurzory (které se běžně nepoužívají), tak okamžitě po spočítání řádků posílá data na klienta, kde se přijatá data alokují do lokální paměti. Ta skutečně není nekonečná, a pokud si vrátíte milióny řádků, tak ještě než začnete v klientovi zpracovávat data (např. v PHP), tak Vám to celé spadne na nedostatku paměti. Jakmile se dotaz spočítá (postgres se chová transakčně), tak se začíná krmit koncový klient (např. PHP), který může převzít data jednorázově a nebo po blocích (ale čte se z lokální paměti, která obsahuje kompletní výsledek). Lze to udělat i jinak, ale to není běžné a běžně se to nepoužívá. Tedy PostgreSQL bufferuje výsledek (pokud někde výpočet spadne, tak vrátí 0 řádek), a vždy bufferuje na straně klienta (což je trochu nečekané, ale je to tak). Ohledně timestampů je také trochu jinak. Postgres použivá multigenerační architekturu, kdy od jednoho záznamu mohu mít v databázi uloženo více verzí. Každá verze záznamu má v sobě číslo transakce, která tu verzi vyrobila a někde bokem je informace, jestli ta transakce už doběhla nebo nikoliv, případně jestli doběhla úspěšně nebo nikoliv. Pak podle nějakých pravidel se zjišťuje, kdo, kdy může vidět kterou verzi záznamu. Např. nemůžete vidět verze, které jsou z nepotvrzené transakce.
    26.3.2015 09:57 Ivan
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Aha tak to se omlouvam, ze jsem mlzil(kecal) nejak jsem predpokladal, ze to funguje podobne jako u ostatnich databazi.
    okbob avatar 26.3.2015 11:20 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Ono tohle moc lidí neví - ale má to svou logiku - distribuuje se využití paměti na klienta, a snižuje se i riziko, že dotaz bude brzdit klient, a navíc je transakční ve smyslu "vrátí všechno nebo nic". A pokud by to výchozí způsob byl příliš náročný na paměť, tak lze použít kurzor.
    27.3.2015 17:31 j
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Cece ...? Php (ale na tom vubec nesejde) preda SQLku dotaz. SQLko vrati VSECHNA data, ktera tomu dotazu odpovidaji. Jak stim potom nalozi programator, uz databazi lautr nezajima.

    Programator si ty data muze narvat do pameti, muze si je narvat na disk ... to je jeho problem, SQLko mu proste vrati resultset, se kterym on muze nejak nakladat. Ale SQLko nemuze vubec nijak resit obsah toho vysledku, protoze uz je zcela mimo jeho kontrolu.

    Je to presne stejny, jako kdyz v databazi napises kursor. Pokud ti celej pobezi v jedny transakci, tak si tim muzes zajistit, ze se mezi tim data nezmeni - a samo tim taky zaridis peknou varku deadlocku. Ale pokud tu transakci takto sam nevytvoris, tak ti select do kursoru vrati result, a pak si klidne muzes smazat celou tu databazi, ten result uz to nezmeni.

    Presne proto je tohle (selectovani hromady dat) poradne blbej napad.
    31.3.2015 07:10 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Je to presne stejny, jako kdyz v databazi napises kursor. Pokud ti celej pobezi v jedny transakci, tak si tim muzes zajistit, ze se mezi tim data nezmeni - a samo tim taky zaridis peknou varku deadlocku.

    Pokud to bude read only, není důvod, aby kvůli tomu něco deadlockovalo.

    30.3.2015 23:32 Bill Gates
    Rozbalit Rozbalit vše Re: Může v postgresql být smazán řádek z ještě nepřečtené result set?
    Aniz bych procital diskuzi pod dotazem, prijde mi logicke, ze kdyz udelam select tak dostanu data v momente selectu. Jinak by se select musel pokazde znovu provest (zaktualizovat) pri kazdem zasahu do databaze znovu, aby se zjistil aktualni stav a to by behem cteni meniciho se resultu udelalo asi pekny chaos a navic by to mohlo byt docela casove hodne narocne.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.