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

Вмъкване на ред и избягване на състояние на състезание (PHP/MySQL)

Обикновено решението на подобни проблеми с паралелността включва транзакции и оптимистично заключване :когато актуализирате брояча, добавете where клауза, за да проверите старата стойност и да преброите броя на актуализираните редове.

v = select value from counter where id=x.
update counter set value = v+1 where value = v and id=x

Ако броячът е бил актуализиран междувременно, актуализацията няма да промени нито един ред – така че знаете, че трябва да върнете назад и да опитате още веднъж транзакцията.

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

Тогава може би е по-добре да се придържате към песимистичното заключване , където първо заключвате реда, след което го актуализирате. Но само бенчмарк ще ви каже.

РЕДАКТИРАНЕ

Ако използвате транзакция без оптимистично заключване, може да се случи следният сценарий.

Max authorized = 50. Current value = 49.

T1: start tx, read value --> 49
T2: start tx, read value --> 49
T1: update value --> 50, acquire a row lock
T1: commits --> release the lock
T2: update value --> 50, acquire a row lock
T2: commits --> release the lock

И двете транзакции са успешни, стойността е 50, но има несъответствие.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Копиране на ред, но с нов идентификатор

  2. Javascript библиотеки, които позволяват SQL-подобни заявки към JSON данни?

  3. mysql автоматично съхранява времева марка за създаване на запис

  4. как да изчистя/изтрия mysql innodb буферен пул?

  5. Как да създавам таблици с N:M връзка в MySQL?