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
и ще видите, че заявката за актуализиране е изпълнена (ако времето за изчакване не е изтекло).