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

Как да се уверите, че няма състояние на състезание в базата данни на MySQL, когато увеличавате поле?

Ето 3 различни подхода:

Атомна актуализация

update table set tries=tries+1 where condition=value;

и ще бъде направено атомарно.

Използвайте транзакции

Ако трябва първо да изберете стойността и да я актуализирате в приложението си, вероятно ще трябва да използвате транзакции. Това означава, че ще трябва да използвате InnoDB, а не MyISAM таблици. Вашата заявка ще бъде нещо като:

BEGIN; //or any method in the API you use that starts a transaction
select tries from table where condition=value for update;
.. do application logic to add to `tries`
update table set tries=newvalue where condition=value;
END;

ако транзакцията е неуспешна, може да се наложи да я опитате отново ръчно.

Схема на версията

Често срещан подход е да въведете колона за версия във вашата таблица. Вашите заявки биха направили нещо като:

select tries,version from table where condition=value;
.. do application logic, and remember the old version value.
update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;

Ако тази актуализация не успее/ върне 0 засегнати реда, някой друг е актуализирал таблицата междувременно. Трябва да започнете отначало – тоест да изберете новите стойности, да изпълните логиката на приложението и да опитате актуализацията отново.



  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:Невалидни ГИС данни, предоставени на функцията st_geometryfromtext

  2. Как да настроя ASP.NET MVC 2 с MySQL?

  3. Spring Boot инициализация на база данни MySQLException за Trigger

  4. Маршрутизиране с AngularJS и Slim PHP

  5. Има ли еквивалент на Profiler за MySql?