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

mysql - Заключване на редове за заявка за избор?

Родното заключване на MySQL не предоставя тази функционалност. Можете да използвате колона, за да извършите вашите „заключвания“.

Ако приемем, че всяка нишка има уникален идентификатор, можете да създадете колона с име thread_owner , със стойност по подразбиране 0.

Една нишка ще вземе ред като този:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

След това изберете реда по този начин (може да не върне нищо, ако няма редове за обработка):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

След това го обработете и накрая го изтрийте.

Това решение ще работи както на MyISAM, така и на InnoDB.

Въпреки това, за InnoDB може да е бавно, тъй като всеки израз UPDATE се опитва да заключи всички редове, където thread_owner =0, и освен ако не сте сигурни, че заключвате всички редове в същия ред всеки път, това може дори да причини блокиране. Така че можете да опитате изрично да заключите цялата таблица във вашия оператор UPDATE:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

По този начин MyISAM и InnoDB ще работят по същия начин.



  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. MySQL групово INSERT или UPDATE

  3. Проверете дали съществува ред, като използвате стар mysql_* API

  4. PHP - Единични или двойни кавички около SQL заявка?

  5. Onchange dropdown values ​​query респ. таблици - с php, mysql, ajax, jquery