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

MySQL:Как да постигнете заключване на транзакция на ниво ред вместо заключване на таблица

Може да е полезно да разгледате как тази заявка всъщност се изпълнява от MySQL:

select * from tbl_codes where available = 1 order by rand() limit 1 for update

Това ще прочете и сортира всички редове, които съответстват на WHERE условие, генерирайте произволно число с помощта на rand() във виртуална колона за всеки ред, сортирайте всички редове (във временна таблица) въз основа на тази виртуална колона и след това върнете редове на клиента от сортирания набор до LIMIT се достига (в този случай само един). FOR UPDATE засяга заключването, извършено от целия израз, докато се изпълнява, и като такава клаузата се прилага, докато редовете се четат в рамките на InnoDB ,не тъй като се връщат на клиента.

Като оставим настрана очевидните последици за производителността от горното (това е ужасно), никога няма да получите разумно поведение при заключване от него.

Кратък отговор:

  1. Изберете реда, който искате, като използвате RAND() или всяка друга стратегия, която харесвате, за да намерите PRIMARY KEY стойност на този ред. Например:SELECT id FROM tbl_codes WHERE available = 1 ORDER BY rand() LIMIT 1
  2. Заключете реда, който искате, като използвате неговия PRIMARY KEY само. Например:SELECT * FROM tbl_codes WHERE id = N

Надяваме се, че това помага.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. подреждане по в рамките на групата concat

  2. Планировчикът на събития трябва да се изпълнява всеки месец

  3. Как сигурно съхранявате паролата и солта на потребителя в MySQL?

  4. Трябва ли да използвам mysql_close(connection)?

  5. LAST_INSERT_ID() е неравен на $db->insert_id?