$zamk=mysql_query("lock tables tabulka write",$spojení);
...následují příkazy např.
$sem=mysql_query("select atakdále......
a nakonec.....
$tuk=mysql_query ("unlock tables",$spojení);
Píše mi to akorát Supplied argument is not a valid MySQL result
resource in.... atakdále.
Přičemž bez těch uzamykcích příkazů skript normálně funguje
Achjo, co je v tom zase za zbytečnou komplikaci.
Takže jestli to někdo ví... ať mě nenapíná .... :-)
zkus si vypsat mysql_error()...
Jelikož je toto vlákno již poněkud starší, dovolím si ho rozšířit o můj dotaz:
Co udělá mysql, pokud do neuzamčené tabulky která má auto_increment přijdou dva INSERTy v jeden okamžik? Vzniknou dvě položky (řádky) se stejným číslem? Ptám se, protože přemýšlím, v jakých případech je nezbytně nutné uzamykat tabulky. Díky!
Kvůli auto_increment tabulky zamykat v MySQL netřeba (pro info, stejně není třeba zamykat tabulky ani kvůli sequential v PostgreSQL).
Zamykání tabulek většina klasických aplikací vůbec nepotřebuje. Má použití například při přebudovávání složitějších struktur (left-right stromy), kdy probíhá několik dotazu postupně po sobě.. jinak moc ne. Dokonce si myslím, že je kontraproduktivní v tutoriálech vůbec zamykání tabulek zmiňovat ;)
Zamykání je taková obdoba transakcí. I když tvrdit to je dosti přitažené za vlasy ;)
Jak se zmínil Freeze. Používá se to pouze ve složitějších situací, kdy je potřeba mít plnou kontrolu nad SQL operacemi. Používají se jasně dané SQLka, která je potřeba v takovéto podobě přesně vykonat. Kdyby do tohoto procesu zasáhl cizí SQL dotaz, tak se celá operace může rozpadnout a znehodnotit. Aby k tomu nedošlo, tak se po tuto dobu zamkne tabulka, aby nikdo cizí do tohoto procesu nezasahoval.
Ale zamykání je kontraproduktivní. V tom s Freeze souhlasím. Místo něj je mnohem lepší používat transakce nebo přehodnotit použití takovýchto dotazů.
Platí to však pro použití více dotazů za sebou. Pro vykonání jednoho dotazu nemá zamykání žádný efekt.
Pokud ve stejnou dobu přijdou dva SQL dotazy, tak ten druhý prostě počká, až se vykoná první. Takže je blbost, aby tyto dva dotazy získaly od auto_incrementu stejné id. Po zpracování prvního se auto_increment navýší a ten druhý už dostane jiné číslo.
Děkuji za odpověď.
Příklad: Registrace uživatele -> ověřuji jestli už v databázi uživatel se stejným jménem není -> pokud není, INSERT uživatele do tabulky uživatelů.
Neměl bych již před oním ověřením tabulku zamknout, aby se mi nestalo:
ověřuji jestli už v databázi uživatel se stejným jménem jako uživatel B není -> zjištuji že není -> ale nyní probíhá INSERT uživatele A se stejným jménem ->nicméně to já už mám chybne (neaktuálně) zjištěno že v tabulce uživatel se stejným jménem jako uživatel B není ->, INSERT uživatele B SE STEJNÝM JMÉNEM jako má uživatel A do tabulky uživatelů-> jedno jméno ve dvou položkách, tedy chyba.
Je to malinko kostrbatě napsáno, ale snad pochopitelné. S auto_increment to nesouvisí, ptám se spíš v reakci na vaši odpověď. Díky.
Pak se jedná o nedotažený datový model.
Pokud chceš zabránit, aby v tabulce existovaly dva uživatele se stejným jménem, pak ošetříš sloupec se jménem o unikátní záznam (nastavit UNIQUE). Pak ti stačí vykonat pouze jeden dotaz a sice přímý zápis uživatele INSERT. Zde je pak potřeba ošetřit kód o zachycení chyby. Pokud uživatel neexistuje, tak se rovnou vytvoří. Pokud však uživatel již existuje, tak databáze vyvolá chybu "Duplicate entry 'blabla' for key 'sloupec'". Takže stačí nastavit UNIQUE, vykonat INSERT a ošetřit návratový kód - pokud ok, tak uživatel vytvořen, pokud chyba, tak uživatel existuje.
A jen tak mimochodem. Pokud používáš auto_increment, tak takový sloupec musí být typu PRIMARY. A PRIMARY v sobě automaticky obsahuje i UNIQUE.
Takže se nikdy nemůže stát, že by dva záznamy měly dvě stejná idčka. Kdyby ses pokusil přes INSERT propašovat id, které již existuje, tak databáze ti to nedovolí, protože v takovém případě vyvolá právě tu chybu "Duplicate entry". idčka přes auto_increment musí být unikátní.
Výbordě, děkuji za kompletní odpověď na všechny mé otázky.