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 23:45 | Zajímavý software

Na blogu Qt bylo představeno Qt 3D Studio. Jedná se o produkt dosud známý pod názvem NVIDIA DRIVE™ Design Studio. NVIDIA jej věnovala Qt. Jedná se o několik set tisíc řádků zdrojového kódu. Qt 3D Studio bude stejně jako Qt k dispozici jak pod open source, tak pod komerční licencí. Ukázka práce s Qt 3D Studiem na YouTube.

Ladislav Hagara | Komentářů: 0
včera 17:50 | Komunita

Nadace The Document Foundation (TDF) zastřešující vývoj svobodného kancelářského balíku LibreOffice slaví 5 let od svého oficiálního vzniku. Nadace byla představena 28. září 2010. Formálně byla založena ale až 17. února 2012.

Ladislav Hagara | Komentářů: 0
včera 12:50 | Komunita

Mozilla.cz informuje, že dosud experimentální funkce Page Shot z programu Firefox Test Pilot (zprávička) se stane součástí Firefoxu. Page Shot je nástroj pro vytváření snímků webových stránek. Umí výběr oblasti, prvku stránky (např. odstavce), nebo uložení snímku celé stránky. Snímky lze ukládat na disk nebo nahrávat na server Mozilly. Nedávno bylo oznámeno, že se součástí Firefoxu stane Activity Stream.

Ladislav Hagara | Komentářů: 7
včera 04:10 | Nová verze

Po 10 týdnech vývoje od vydání Linuxu 4.9 (zprávička) oznámil Linus Torvalds, mj. již 20 let žijící v USA, vydání Linuxu 4.10 (LKML). Přehled nových vlastností a vylepšení například na Kernel Newbies a v Jaderných novinách (1, 2 a 3). Kódové jméno Linuxu 4.10 je Fearless Coyote.

Ladislav Hagara | Komentářů: 4
19.2. 15:55 | Zajímavý projekt

Vyzkoušet si příkazy a vyřešit několik úkolů lze na stránkách Commandline Challenge (CMD Challenge). Úkoly lze řešit různými způsoby, důležitý je výsledek. Zdrojové kódy jsou k dispozici na GitHubu pod licencí MIT.

Ladislav Hagara | Komentářů: 18
18.2. 17:35 | Bezpečnostní upozornění

Německá Bundesnetzagentur (obdoba českého ČTU) zakázala na německém území prodej panenky Cayla kvůli „špionáži“ dětí. Tato elektronická hračka obsahuje mikrofon, reproduktor a kameru a bezdrátové komunikační rozhraní, pomocí kterého se hračka připojuje na servery výrobce. Takovýmto způsobem může hračka pomocí umělé inteligence „odpovídat“ na dotazy dítěte. Hlavní problém bude ale asi někde jinde, podle prvotních zpráv může

… více »
Petr Tomášek | Komentářů: 31
17.2. 15:30 | Bezpečnostní upozornění

CSIRT.CZ upozorňuje, že bezpečnostní experti objevili nový typ malwaru, jenž cílí na open source e-commerce platformu Magento. Malware je zajímavý tím, že se jedná o první svého druhu, jehož kód zůstává skrytý v SQL databázi zasaženého e-shopu. Škodlivý kód je volán pomocí tzv. SQL trigerru, který je spouštěn při každém vytvoření objednávky v systému.

Ladislav Hagara | Komentářů: 3
17.2. 09:00 | Nová verze

Bylo vydáno Ubuntu 16.04.2 LTS, tj. druhé opravné vydání Ubuntu 16.04 LTS s kódovým názvem Xenial Xerus. Přehled novinek v poznámkách k vydání a v přehledu změn.

Ladislav Hagara | Komentářů: 57
17.2. 06:00 | Zajímavý článek

Pavel Tišnovský se v dvoudílném článku na MojeFedora.cz věnuje tvorbě pluginů (modulů) pro bitmapový grafický editor GIMP. Pomocí pluginů lze GIMP rozšiřovat o další funkce. Implementovat lze například nové filtry nebo pomocné utility pro tvorbu animací či poloautomatickou retuš snímků.

Ladislav Hagara | Komentářů: 6
16.2. 23:32 | Komunita

Do 30. března se lze přihlásit do dalšího kola programu Outreachy, jehož cílem je přitáhnout do světa svobodného a otevřeného softwaru lidi ze skupin, jež jsou ve světě svobodného a otevřeného softwaru málo zastoupeny. Za 3 měsíce práce, od 30. května do 30. srpna 2017, v participujících organizacích lze vydělat 5 500 USD. Jedná se již o 14. kolo tohoto programu.

Ladislav Hagara | Komentářů: 11
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (13%)
 (2%)
 (71%)
 (3%)
 (10%)
Celkem 670 hlasů
 Komentářů: 53, poslední včera 18:38
Rozcestník
Reklama

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: 992×
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: 37 | 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.