A SELECT FOR UPDATE заключва реда, който сте избрали за актуализиране, докато транзакцията, която сте създали, приключи. Други транзакции могат да четат само този ред, но не могат да го актуализират, докато транзакцията за избор за актуализиране все още е отворена.
За да заключите редовете:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;
Транзакцията по-горе ще бъде активна и ще заключи реда, докато не бъде ангажиран.
За да го тествате, има различни начини. Тествах го с помощта на две терминални инстанции с MySQL клиент, отворен във всеки един.
На first terminal стартирате SQL:
START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive
На second terminal можете да опитате да актуализирате реда:
UPDATE test SET parent = 100 WHERE id = 4;
Тъй като създавате избор за актуализация на first terminal заявката по-горе ще изчака, докато транзакцията за избор за актуализиране бъде ангажирана или ще изтече.
Върнете се към first terminal и извършете транзакцията:
COMMIT;
Проверете second terminal и ще видите, че заявката за актуализиране е изпълнена (ако времето за изчакване не е изтекло).