Mysql
 sql >> база данни >  >> RDS >> Mysql

Mysql изберете за актуализиране - не заключва целевите редове. Как да се уверя, че е така?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Динамично добавяне на колони към резултатите от заявката

  2. Две колони като първичен ключ в mysql?

  3. Как конструкторът на детски клас ще взаимодейства с конструктор на родителски клас в php?

  4. Използване на .aggregate() върху стойност, въведена с помощта на .extra(select={...}) в Django заявка?

  5. Spring Data Join със спецификации