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

Как да заключа на InnoDB ред, който все още не съществува?

Въпреки че отговорът по-горе е верен, тъй като SELECT ... FOR UPDATE ще попречи на едновременни сесии / транзакции да вмъкнат един и същ запис, това не е пълната истина. В момента се боря със същия проблем и стигнах до заключението, че SELECT ... FOR UPDATE е почти безполезен в тази ситуация поради следната причина:

Едновременна транзакция/сесия може също да направи SELECT ... FOR UPDATE на същата стойност на запис/индекс и MySQL с радост ще приеме това незабавно (неблокиращо) и без да хвърля грешки. Разбира се, веднага след като другата сесия направи това, вашата сесия също не може да вмъкне записа повече. Нито вашата, нито другата сесия/транзакция получават никаква информация за ситуацията и смятат, че могат безопасно да вмъкнат записа, докато всъщност не се опитат да го направят. Опитът за вмъкване след това води или до задънена улица, или до грешка с дублиран ключ, в зависимост от обстоятелствата.

С други думи, SELECT ... FOR UPDATE не позволява на други сесии да вмъкнат съответния(ите) запис(и), НО дори ако направите SELECT ... FOR UPDATE и съответният запис не бъде намерен, има вероятност да не можете всъщност вмъкнете този запис. IMHO, това прави безполезен метода „първа заявка, след това вмъкване“.

Причината за проблема е, че MySQL не предлага никакъв метод за наистина заключете несъществуващи записи. Две едновременни сесии/транзакции могат да заключат несъществуващи записи „ЗА АКТУАЛИЗИРАНЕ“ едновременно, нещо, което наистина не би трябвало да е възможно и което прави разработването значително по-трудно.

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

Само моите 2 цента ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо INSERT IGNORE увеличава първичния ключ auto_increment?

  2. Съвети за надграждане от MySQL 5.7 до MySQL 8

  3. Конвертирайте MySQL база данни от латински в UTF-8

  4. Изпълнете SQL заявка при стартиране на услугата MySQL

  5. Как да изчислим медиана в MySQL