Autor Zpráva
plundr
Profil *
Ahoj, potřeboval bych zaknout tabulku v transakci přes PDO aby nikdo nemohl zapisovat nebo upravovat (ale číst ano).
Našel jsem článek na Zamykání MySQL tabulek, ale nechápu jak je toto myšeleno:

Nejjednodušší je v případě používání transakcí přidat za dotaz SELECT příkaz FOR UPDATE
...a potom tam je druhá metoda:
Chceme-li použít zamykání i transakce zároveň. Doporučený postup je následující:

ta první metoda tedy neni při použití transakcí? Nebo jak to mám zamykat?
Kajman
Profil
Skoro vždy stačí zamykat řádky, kterých se transakce týká. To dělá automaticky úložiště innodb v kombinaci s nativními příkazy pro transakce.

Jste si jistý, že potřebujete zamykat celou tabulku?
plundr
Profil *
Kajman:
Jste si jistý, že potřebujete zamykat celou tabulku?
třebas když mám ve foru složku kde mám x podsložek (mám to v jedné tabulce slozky)
..a já chci smazat všechny podsložky a výchozí složku tak musím zamknout tabulku "slozky"kdyby se náhodou stalo že do té výchozí složky se někdo pokusí vytvořit novou podsložku ještě předtím než se spustí commit. Já myslím že je potřeba zaknout celou složku pro zápis a úpravu. Čtení by mohlo být povoleno. V tom nevidím problém.
Kajman
Profil
Když budete mít podložky správně provázané cizím klíčem, který bude nastaven, že má smazat položku, pokud se záznam, na který se odkazuje smaže, tak nemusíte nic zamykat. Složku smažete, smažou se automaticky všechny podsložky. Insert na neexistujícího rodiče se nepovede.
plundr
Profil *
problém je v tom že já je nemažu ale jenom označuju za smazané, mám tam pole "smazano" (bool).
Kajman
Profil
A rekurzivním dotazem označíte všechny podsložky také na smazané? Pak stačí udělat transakci, kdy se zeptáte na rodiče, zda je smazaný a pokud je smazaný, nebudete dělat insert a vrátíte chybu. Na to prostě není potřeba při innodb zamykat celou tabulku - stačí transakcí zamčít řádky, které jsou pro tuto operace potřeba.
plundr
Profil *
Jak by jsi měl řešené fórum ty?

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:

0