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

MySQL поставя ли заявки на опашка?

ЗАПРАВКИ НЕ ВИНАГИ СЕ ИЗПЪЛНЯВАТ ПАРАЛЕЛНО

Зависи от двигателя на базата данни. С MyISAM почти всяка заявка придобива заключване на ниво таблица, което означава, че заявките се изпълняват последователно като опашка. С повечето други двигатели те могат да работят паралелно.

echo_me казва nothing happens at the exact same time and a CPU does not do everything at once

Това не е точно вярно. Възможно е СУБД да работи на машина с повече от един процесор и с повече от един мрежов интерфейс. Това емного малко вероятно е 2 заявки да пристигнат едновременно - но не е невъзможно, следователно има мютекс, който да гарантира, че преходът за изравняване/изпълнение се изпълнява само като една нишка (на изпълнение - не е задължително със същия лек процес).

Има 2 подхода за решаване на едновременен DML - или за използване на транзакции (където всеки потребител ефективно получава клонинг на базата данни) и когато заявките са завършени, СУБД се опитва да съгласува всички промени - ако съгласуването е неуспешно, тогава СУБД връща обратно един от заявките и го докладва като неуспешен. Другият подход е да се използва заключване на ниво ред - СУБД идентифицира редовете, които ще бъдат актуализирани чрез заявка и ги маркира като запазени за актуализиране (другите потребители могат да прочетат оригиналната версия на всеки ред, но всеки опит за актуализиране на данните ще бъде блокиран, докато редът е наличен отново).

Проблемът ви е, че имате два клиента на mysql, всеки от които е възстановил факта, че е останал един артикул на склад. Това допълнително се усложнява от факта, че (тъй като споменавате PHP) нивата на запасите може да са били извлечени в различна сесия на СУБД от последващата корекция на запасите - не можете да имате транзакция, обхващаща повече от HTTP заявка. Следователно трябва да потвърдите повторно всеки факт, поддържан извън СУБД в рамките на една транзакция.

Оптимистичното заключване може да създаде псевдо - механизъм за контрол на транзакциите - маркирате запис, който предстои да промените, с времева марка и потребителски идентификатор (с PHP идентификаторът на сесията на PHP е добър избор) - ако когато дойдете да го промените, нещо друго го промени, тогава кодът ви знае, че данните, които е изтеглил преди, са невалидни. Това обаче може да доведе до други усложнения.



  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 5.7 от Windows

  2. MySQL - CASE срещу IF оператор срещу функция IF

  3. Как да оптимизираме болезнено бавната MySQL заявка, която намира корелации

  4. Къде да добавите jdbc драйвера на Netbeans/Glassfish в Windows?

  5. Как да накарам MySQL да обработва UTF-8 правилно