abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    11.5. 18:22 | Nová verze

    Byla vydána verze 0.2.0 v Rustu napsaného frameworku Pingora pro vytváření rychlých, spolehlivých a programovatelných síťových systémů. Společnost Cloudflare jej letos v únoru uvolnila pod licencí Apache 2.0.

    Ladislav Hagara | Komentářů: 0
    10.5. 19:11 | Nová verze

    Open source RDP (Remote Desktop Protocol) server xrdp (Wikipedie) byl vydán ve verzi 0.10.0. Z novinek je vypíchnuta podpora GFX (Graphic Pipeline Extension). Nová větev řeší také několik bezpečnostních chyb.

    Ladislav Hagara | Komentářů: 13
    10.5. 04:11 | Nová verze

    Rocky Linux byl vydán v nové stabilní verzi 9.4. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    9.5. 22:22 | Bezpečnostní upozornění

    Dellu byla odcizena databáze zákazníků (jméno, adresa, seznam zakoupených produktů) [Customer Care, Bleeping Computer].

    Ladislav Hagara | Komentářů: 22
    9.5. 21:11 | Zajímavý článek

    V lednu byl otevřen editor kódů Zed od autorů editoru Atom a Tree-sitter. Tenkrát běžel pouze na macOS. Byl napevno svázán s Metalem. Situace se ale postupně mění. V aktuálním příspěvku Kdy Zed na Linuxu? na blogu Zedu vývojáři popisují aktuální stav. Blíží se alfa verze.

    Ladislav Hagara | Komentářů: 54
    9.5. 14:33 | Pozvánky

    O víkendu 11. a 12. května lze navštívit Maker Faire Prague, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.

    Ladislav Hagara | Komentářů: 0
    8.5. 21:55 | Nová verze

    Byl vydán Fedora Asahi Remix 40, tj. linuxová distribuce pro Apple Silicon vycházející z Fedora Linuxu 40.

    Ladislav Hagara | Komentářů: 20
    8.5. 20:22 | IT novinky

    Představena byla služba Raspberry Pi Connect usnadňující vzdálený grafický přístup k vašim Raspberry Pi z webového prohlížeče. Odkudkoli. Zdarma. Zatím v beta verzi. Detaily v dokumentaci.

    Ladislav Hagara | Komentářů: 7
    8.5. 12:55 | Nová verze

    Byla vydána verze R14.1.2 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.

    JZD | Komentářů: 0
    7.5. 18:55 | IT novinky

    Dnešním dnem lze již také v Česku nakupovat na Google Store (telefony a sluchátka Google Pixel).

    Ladislav Hagara | Komentářů: 10
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (69%)
     (7%)
     (11%)
     (13%)
    Celkem 192 hlasů
     Komentářů: 11, poslední 10.5. 18:00
    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: 1021×
    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: 45 | 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: 72 | 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.