Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql - Bloqueando linhas para consulta selecionada?


O bloqueio nativo do MySQL não fornece essa funcionalidade. Você pode usar uma coluna para realizar seus "bloqueios".

Supondo que cada thread tenha um ID exclusivo, você pode criar uma coluna chamada thread_owner , com padrão 0.

Um thread pegaria uma linha como esta:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Em seguida, selecione a linha assim (pode retornar nenhum, se não houver linhas a serem processadas):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Em seguida, processe-o e, finalmente, exclua-o.

Esta solução funcionaria tanto no MyISAM quanto no InnoDB.

No entanto, para o InnoDB, pode ser lento porque cada instrução UPDATE está tentando bloquear todas as linhas em que thread_owner =0 e, a menos que você tenha certeza de que está bloqueando todas as linhas na mesma ordem todas as vezes, pode até causar um deadlock. Então, você pode tentar bloquear explicitamente toda a tabela em sua instrução UPDATE:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

Dessa forma, tanto o MyISAM quanto o InnoDB funcionarão da mesma maneira.