Autor Zpráva
ShiraNai7
Profil
Chtěl bych se zeptat, jak je to s multithreadingem v PHP. To znamená, jestli se zpracovává více skriptů najednou (buď skutečný multithreading nebo prostě více procesů php najednou). Protože v CMS, co programuji, spoléhám na to, že veškerou návaznost tabulek na sebe (přes ID) mám ošetřenou kódem a tak se nemůže stát, aby například existoval článek, který má jako autora uvedeno ID neexistujícího uživatele. Proto také při zobrazování článku ani nekontroluji to, jestli dotaz na načtení dat o autorovi vrátil nějaká data. Proto bych se rád zeptal, zda se mám obávat toho, že se může stát následující (příklad):

Mám 2 skripty. Skript číslo 1 vytváří nový článek, číslo 2 maže uživatele. Skript 1 před vytvořením článku zkontroluje, zda zvolený autor článku (jeho ID) existuje v tabulce uživatelů. A když se spustí oba skripty zároveň, může nastat toto?

Skript 1: kontrola zda existuje uživatel (výsledek = existuje, nalezen v tabulce)
Skript 2: vymazání uživatele z tabulky
Skript 1: vložení článku do databáze (s neplatným ID uživatele!)

Skripty může spouštět jeden uživatel, nebo třeba 2 na sobě nezávislí.
joe
Profil
A když se spustí oba skripty zároveň, může nastat toto?
Jak chceš spustit dva skripty zároveň? (asi mi něco uniklo). Pokud je opravdu spustíš zároveň, pak jeden má určitě větší prioritu.

Proto také při zobrazování článku ani nekontroluji to, jestli dotaz na načtení dat o autorovi vrátil nějaká data.
To ani kontrolovat nemusíš, stačí použít JOIN v SQL dotazu.
Nox
Profil
Ano, toto nastat může: http://php.vrana.cz/atomicita-operaci.php
Alphard
Profil
Jestli dobře chápu popsanou situaci, tak ano, může se to stát. PHP zpracovává požadavky od jednotlivých uživatelů paralelně. Velké problémy to přináší při práci se soubory. Pravděpodobnost kolize při přidání článku a smazání uživatele bude hodně malá (tyto akce jsou samy o sobě málo časté), ale lze to ošetřit zamykáním tabulek.

Nicméně, pokud při smazání uživatele neopravujete všechny jeho předchozí zásahy, tak to IMHO nemá cenu řešit.
kajaman
Profil
myslím, že tvůj problém řeší referenční integrita a engina, která podporuje cizí klíče je v mysql innodb
Mastodont
Profil
Co znamená "maže uživatele"? Fyzický výmaz z tabulky? Co třeba jen nastavit uživateli příznak "smazáno" na true?
Nox
Profil
#8 > Zkus to co psal kajaman nebo LOCK TABLES
ShiraNai7
Profil
Ano při vymazání uživatele se opraví autor u článků (např na hosta), ale když se spouští skript na vymazání uživatele (v tom mém příkladu), tak daný článek ještě neexistuje.
ShiraNai7
Profil
Takze zkusil jsem si vytvorit 2 soubory. Jeden zamkne tabulku pouze pro cteni a vycka 5 sekund. Pak skonci (tabulka se odemkne). Druhy vypise vsechna data z tabulky. Spustil jsem prvni a pak hned druhy. Druhy ceka tak dlouho, nez skonci skript prvni (nez se odemkne tabulka). To je presne to, co jsem chtel, diky. Doufam, ze takto to funguje vsude.
Mastodont
Profil
Jenže LOCK TABLES bývá často zakázáno, viz třeba
http://www.drupal.cz/webhosting/nefunkcni
To není dobrá cesta.
ShiraNai7
Profil
Jak to mám teda asi udělat? Počítat s tím, že všude bude MySQL 5+ a jakési innodb (které dost dobře nechápu jak mi pomůže), nemůžu. Nebo snad ano?
Mastodont
Profil
Já jsem ti radil - namísto mazání jen nastavit uživateli příznak "smazáno" na true - a dál s ním nepracovat. Data s ním svázaná ale zůstanou nedotčená. Fyzické smazání udělat až po čase a mít přitom web v offline režimu.
ShiraNai7
Profil
Pochybuju ze napr. CMS jako drupal ci joomla to delaji takto silenym zpusobem.
Nox
Profil
ShiraNai7
Vždyť právě Drupal bez LOCK TABLES nejede, aspoň to jsem odvodil z Mastodontova odkazu

Myslím si že MySQL 5 je už snad standard a InnoDB engine je normálně součástí mysql ... není to "jakési InnoDB", často slýchávám, že je kvalitnější než výchozí MyISAM engine, který používáš teď...nehodnotím to, jen říkám, že jsem tento názor nejednou zahlédl

A to s nepodporou LOCK TABLES myslim nebude tak horký

Jakože...u těch dvou hostingů zmíněných v odkaze bych si dobrovolně hosting neobjednal a třetí je free ... prostě kompatibilita OK, ale nemělo by se to myslím brát až do extrému
ShiraNai7
Profil
A tedy funkce innodb mi by tu mohl nekdo vysvetlit? Pripadne link na nejaky clanek. Zajimaji me konkretne funkce, ktere mi pomuzou udrzet databazi konzistentni ve smyslu, aby se nikde nemohly nachazet odkazy na neexistujici id zaznamu v db, zpusobene prave tim, co jsem popsal v prvnim prispevku.
Mastodont
Profil
ShiraNai7
Hledej cokoli obsahující "referential integrity" nebo "foreign keys".

Pochybuju ze napr. CMS jako drupal ci joomla to delaji takto silenym zpusobem
Asi ne, a proto jsou zdarma, protože peníze by za ně nikdo nedal. Čerstvá zkušenost z dnešního dne - zbrusu nově instalovaný Drupal začal po aktivaci modulu Throttle natvrdo shazovat Apache. Jo, kvalita.
ShiraNai7
Profil
Paráda, super. To je ono. Funguje to krásně.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: