Vamos supor que eu tenha uma consulta no formulário:
INSERT INTO tableA (...) select ... from tableB;
Agora, é possível que esta consulta, durante a execução, bloqueie INSERT
instruções simples para tableB
? Informação adicional:
- Todas as tabelas são InnoDB
- Não há transações explícitas (autocommit está ativado)
- NÃO há uma
FOR UPDATE
cláusula naSELECT
instrução (nem tenho certeza se seria possível fazer isso em umaINSERT...SELECT
construção) - A consulta SELECT real é obviamente mais complicada e envolve agrupamento e uniões, mas isso não deve mudar nada, certo?
- O nível de isolamento da transação para todas as consultas é o padrão
REPEATABLE READ
- A versão precisa do banco de dados é MariaDB 10.0.12
Sim,
SELECT
é uma seleção de bloqueio neste caso.Se você usar
SELECT
em qualquer consulta que altere dados, é implicitamente uma consulta de bloqueio como se você tivesse usadoSELECT ... LOCK IN SHARE MODE
. Isso coloca um bloqueio compartilhado nas linhas que ele lê.Qualquer outra instrução que altera os dados age da mesma maneira. Isso inclui casos como:
INSERT ... SELECT ...
CREATE TABLE ... AS SELECT ...
SELECT ... INTO variable
ou... INTO OUTFILE
SET @variable = (SELECT ...)
INSERT
/UPDATE
/DELETE
que executa umSELECT
em seu corpo.UPDATE
ouDELETE
declaraçõesUm bloqueio compartilhado pode ser mantido por várias sessões simultâneas. Então você pode fazer essa
INSERT ... SELECT
consulta em várias transações. Eles não entrarão em conflito entre si.Mas um
INSERT
to tableB deve ter um bloqueio exclusivo. Um bloqueio exclusivo não será concedido se houver bloqueios compartilhados presentes.