Mysql Reference Guide
6.7.2. A LOCK TABLES / UNLOCK TABLES parancs szintaxisa parancsokat ad
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ázat automatikusan feloldódik, 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 `` varrva '' (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árolási táblázathoz 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. Lásd: 4.5.5 szakasz, "KILL Command Syntax".
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 olyan táblázatokat használ, amelyek nem támogatják a tranzakciókat, akkor a táblázatos feldolgozóprogram használatakor a LOCK TABLES parancs használatával ellenőrizze, hogy nincs-e más szál a SELECT és az UPDATE műveletek között. 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. Ezeket a blokkokat a hash tábla tárolja a kiszolgálón, és a nagy sebesség érdekében a pthread_mutex_lock () és a pthread_mutex_unlock () függvényt használják. Lásd: 6.3.6.2. Szakasz, "Különféle funkciók".
További információ a zárszerkezetről: 5.3.1. Szakasz, "A MySQL zárolása táblák".
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. Lásd: 4.5.3. Szakasz, "Szintaxis a FLUSH parancshoz". 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 lefoglalja az összes aktív tranzakciót, mielőtt megpróbálja lezárni a táblákat.