A záróasztalok szintaxisa
A LOCK TABLES parancs blokkolja az adott tábla megadott tábláit. Az UNLOCK TABLES parancs eltávolítja a szálon tárolt zárakat. Az aktuális szál által blokkolt összes táblázatot automatikusan feloldják, ha egy másik LOCK TABLES parancs jelenik meg az adatfolyamban, vagy amikor a kiszolgálóval való kapcsolódás megszakad.
A LOCK TABLES parancs használata a MySQL 4.0.2-ben, akkor a globális LOCK TABLES és a SELECT jogosultságokkal kell rendelkeznie a megadott táblákhoz. A MySQL 3.23-ban ez igényel SELECT jogosultságokat. INSERT. DELETE és UPDATE a szóban forgó táblázatokhoz.
A LOCK TABLES parancs használatának legfontosabb előnyei az, hogy lehetővé teszik a tranzakciók emulálását vagy nagyobb sebesség elérését a táblázatok frissítésekor. Ezt részletesebben az alábbiakban ismertetjük.
A READ LOCAL és a READ közötti különbség az, hogy a READ LOCAL lehetővé teszi a nem ütköző INSERT parancsok végrehajtását a zár megléte során. Ez a parancs azonban nem használható a MySQL kiszolgálón kívüli adatbázisfájlok kezelésére ezen zár alatt.
A LOCK TABLES parancs használatakor minden későbbi lekérdezésben meg kell tiltania az összes táblát, ugyanazon aliasokat, amelyek a lekérdezésekben lesznek! Ha a táblázatot többször említi a lekérdezésben (aliasokkal), minden egyes álnevet le kell tiltania!
A WRITE zár általában magasabb prioritást élvez, mint a READ zárolás. Annak érdekében, hogy a változtatásokat a lehető leggyorsabban feldolgozzák. Ez azt jelenti, hogy ha egy szál READ zárolást kap, majd egy másik szál WRITE zárolást kér. a későbbi READ zárolási kérelmek várják, amíg a WRITE szál meg nem kap egy zárat és eltávolítja azt. Használhatja a LOW_PRIORITY WRITE zárakat. lehetővé téve más szálak számára, hogy READ zárolásokat kapjanak, miközben a fő szál vár a WRITE zárra. LOW_PRIORITY WRITE zárak csak akkor használhatók, ha biztos abban, hogy végül olyan idő lesz, amikor egyik szál sem lesz READ zárolva.
A LOCK TABLES parancs a következőképpen működik:
Az összes zárt táblát rendezi a belsőleg meghatározott sorrendben, azaz "Sewn up" (a felhasználó szempontjából ez a sorrend nincs megadva).
A WRITE zár a READ zár előtt van elhelyezve. ha a táblák READ és WRITE zárral vannak lezárva.
Egyszerre egy táblát blokkol, amíg a szál meg nem kapja a zárakat.
A leírt műveleti sorrend biztosítja, hogy a táblázat blokkolása ne okozzon holtpontot. Vannak azonban más dolgok is, amelyekről tudatában kell lenned, ha a leírtakon dolgozol:
A LOW_PRIORITY WRITE használata a záróasztalhoz csak azt jelenti, hogy a MySQL végrehajtja ezt a zárat, amíg egy szál megjelenik, amely READ zárolást igényel. Ha a szál WRITE zárolást kap, és várja meg, hogy a következő táblázat zárva legyen a zárolt táblák listájából, minden más szál várni fogja, amíg a WRITE zárolás megszűnik. Ha ez komoly problémát jelent az alkalmazásához, gondoljon arra, hogy a meglévő táblákat más táblákra konvertálja, amelyek támogatják az ügyleteket.
Az asztalzárat várt szál biztonságosan megsemmisíthető a KILL paranccsal. A KILL parancs szintaxisa.
Ne feledje, hogy az INSERT DELAYED utasítással együtt nem használható tiltás. mivel ebben az esetben az INSERT parancs külön szálként kerül végrehajtásra.
Általában nincs szükség a táblák lezárására, mivel minden egyes UPDATE parancs oszthatatlan; Egyetlen másik szál sem tud kapcsolódni bármely olyan SQL parancshoz, amely jelenleg fut. Bizonyos esetekben azonban előnyös a táblákat egyik vagy másik módon lezárni:
Ha azt tervezi, hogy fut sok műveletet a kapcsolt táblák, akkor sokkal gyorsabban lezárni a táblákat fog használni. Természetesen ennek hátsó oldala van, hiszen egyetlen vezérlőáram sem tudja frissíteni a táblát READ zárolással, vagy olvasni a WRITE zárolási táblázatot. Amikor lezárja LOCK TABLES műveletek gyorsabb, mert ebben az esetben a MySQL nem ír a lemezre kulcsgyorsítótárnál a zárolt táblákat, amíg UNLOCK táblázatok parancs nevét (általában kulcsgyorsítótárnál átöblítjük után SQL-parancs). A LOCK TABLES használata növeli a írási / frissítési / törlési sebességet a táblákban, például a MyISAM-ban.
Ha egy táblázatot, amely nem támogatja a tranzakciókat, majd táblázatkezelő program segítségével kell alkalmazni a LOCK TABLES parancs, hogy semelyik másik szál jön közötti SELECT és UPDATE. A következő példa bemutatja, hogyan használhatja a LOCK TABLES műveleteket a műveletek sikeres végrehajtásához:
A LOCK TÁBLÁZAT használata nélkül lehetséges, hogy bármely más vezérlőszál új sorba illeszthet be a transz táblába a SELECT és UPDATE műveletek végrehajtása között.
A lépésenkénti frissítések (UPDATE ügyfél SET értéke = érték + új_érték) vagy LAST_INSERT_ID () függvény használata. A LOCK TABLES parancs használata sok esetben elkerülhető.
Néhány probléma megoldható a blokkolási funkciók GET_LOCK () és RELEASE_LOCK () felhasználói szinten történő alkalmazásával. Ezek a blokkok vannak tárolva egy hash tábla a szerver, és hogy egy nagy sebességű, vannak megvalósítva pthread_mutex_lock () és pthread_mutex_unlock (). Különböző funkciók.
A lezárási mechanizmussal kapcsolatos további információkért lásd: A MySQL blokkolja a táblázatokat.
Az összes táblát az összes adatbázisban blokkolhatja a READ letiltásával a FLUSH TABLES WITH READ LOCK parancs segítségével. A FLUSH parancs szintaxisa. Ez nagyon hasznos a Veritas-hoz hasonló fájlrendszer biztonsági másolatának megszerzéséhez, ami a memóriában előforduló memóriakártyákat igényelheti.
Megjegyzés: A LOCK TABLES parancs nem ment el tranzakciókat és automatikusan rögzíti az összes aktív tranzakciót, mielőtt le akarja zárni az asztalokat.