A SELECT FOR UPDATE
uzamkne řádek, který jste vybrali pro aktualizaci, dokud neskončí vámi vytvořená transakce. Ostatní transakce mohou tento řádek pouze číst, ale nemohou jej aktualizovat, dokud je stále otevřená transakce výběru pro aktualizaci.
Chcete-li zamknout řádek(y):
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Výše uvedená transakce bude aktivní a uzamkne řádek, dokud nebude potvrzena.
Chcete-li to otestovat, existují různé způsoby. Testoval jsem to pomocí dvou instancí terminálu s klientem MySQL otevřeným v každé z nich.
Na first terminal
spustíte SQL:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
Na second terminal
můžete zkusit aktualizovat řádek:
UPDATE test SET parent = 100 WHERE id = 4;
Protože vytvoříte volbu pro aktualizaci na first terminal
výše uvedený dotaz počká, dokud nebude potvrzena transakce výběru pro aktualizaci, nebo vyprší časový limit.
Vraťte se na first terminal
a potvrďte transakci:
COMMIT;
Zkontrolujte second terminal
a uvidíte, že aktualizační dotaz byl proveden (pokud nevypršel časový limit).