[Tutorial] Bloqueio de tabela MySQL


Neste tutorial, você aprenderá a usar bloqueios do MySQL para coordenar o acesso à tabela entre as sessões.

O MySQL permite que sessões de cliente adquiram bloqueios de tabela explicitamente para evitar que outras sessões acessem a tabela durante um período específico de tempo. As sessões de cliente só podem adquirir ou liberar bloqueios de tabela para si mesmas. Ele não pode adquirir ou liberar bloqueios de tabela para outras sessões.

Antes da introdução detalhada, criaremos um banco de dados de amostra denominado sampledb, que contém uma tabela tbl simples para simular a instrução de bloqueio da tabela de prática.

CRIAR BANCO DE DADOS SE NÃO EXISTIR testdb; USE testdb; CRIAR TABELA tbl (id int (11) NOT NULL AUTO_INCREMENT, col int (11) NOT NULL, PRIMARY KEY (id)); 

Sintaxe das tabelas LOCK e UNLOCK

A forma simples de adquirir um bloqueio de tabela é a seguinte:

LOCK TABLES nome_tabela [READ | ESCREVA] 

Você pode colocar o nome da tabela após a palavra-chave LOCK TABLES, seguido por um tipo de bloqueio. O MySQL oferece dois tipos de bloqueio: READ e WRITE. Apresentaremos esses dois tipos de bloqueio em detalhes na próxima seção.

Para liberar o bloqueio da mesa, use a seguinte instrução:

DESBLOQUEAR TABELAS; 

Tabela bloqueada como READ

O bloqueio READ da tabela tem as seguintes funções:

Ao mesmo tempo, o bloqueio READ da tabela pode ser adquirido por meio de várias sessões. Além disso, outras sessões podem ler dados da tabela sem adquirir um bloqueio.

Uma sessão que contém um bloqueio READ só pode ler dados da tabela, mas não pode gravar. Além disso, outras sessões não podem gravar dados na tabela antes de liberar o bloqueio READ. Uma operação de gravação de outra sessão será colocada em um estado de espera até que o bloqueio READ seja liberado.

Se a sessão terminar normalmente ou de forma anormal, o MySQL irá liberar implicitamente todos os bloqueios. Isso também está relacionado aos bloqueios WRITE.

Vamos dar uma olhada em como o bloqueio READ funciona nas seguintes situações.

Primeiro, conecte-se ao banco de dados testdb. Para encontrar o ID da conexão atual, use a função CONNECTION_ID (), conforme mostrado abaixo:

mysql> SELECT CONNECTION_ID (); + ----------------- + | CONNECTION_ID () | + ----------------- + | 6 + ----------------- + 1 linha no conjunto 

Em seguida, insira um na tabela tbl.

INSERT INTO tbl (col) VALORES (10); 

Em seguida, recupere todas as linhas da tabela acima tbl.

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 10 + ---- + ----- + 1 linha no conjunto 

Depois disso, para adquirir o bloqueio, você pode usar a instrução LOCK TABLE. Finalmente, na mesma sessão, se você tentar inserir uma nova linha na tabela tbl, receberá uma mensagem de erro.

mysql> LOCK TABLE tbl READ; Consulta OK, 0 registros afetados mysql> INSERT INTO tbl (col) VALUES (11); 1099 - A tabela 'tbl' foi bloqueada com um bloqueio READ e não pode ser atualizada mysql> 

Portanto, uma vez obtido o bloqueio READ, os dados não podem ser gravados na tabela na mesma sessão. Vejamos o bloqueio READ de diferentes sessões.

Primeiro, abra outro terminal e conecte-se ao banco de dados testdb e, em seguida, verifique o ID da conexão:

mysql> SELECT CONNECTION_ID (); + ----------------- + | CONNECTION_ID () | + ----------------- + | 7 + ----------------- + 1 linha no conjunto 

Em seguida, recupere os dados de tbl conforme mostrado abaixo -

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 10 + ---- + ----- + 1 linha no conjunto 

Em seguida, insira uma nova linha da segunda sessão (ID de sessão 7) na tabela tbl.

Bloqueio de tabela MySQL

A operação de inserção da segunda sessão está em um estado de espera porque a primeira sessão adquiriu um bloqueio READ na tabela tbl e ainda não o liberou.

Você pode usar a instrução SHOW PROCESSLIST para ver informações detalhadas, conforme mostrado abaixo -

mysql> MOSTRAR LISTA DE PROCESSOS; + ---- + ------ + ----------------- + ---------- + -------- - + ------ + --------------------------------- + ------- -------------------------- + | Id | Usuário | Host | db | Command | Tempo | Estado | Info | + ---- + ------ + ----------------- + ---------- + -------- - + ------ + --------------------------------- + ------- -------------------------- + | 2 | root | localhost: 51998 | NULL | Dormir | 474 | NULL | | 3 | root | localhost: 51999 | yiibaidb | Dormir | 3633 | | NULL | | 6 root | localhost: 52232 | testdb | Query | 0 | começando | MOSTRAR LISTA DE PROCESSOS | | 7 root | localhost: 53642 | testdb | Query | 110 Aguardando bloqueio de metadados da tabela | INSERIR EM tbl (col) VALORES (20) | + ---- + ------ + ----------------- + ---------- + -------- - + ------ + --------------------------------- + ------- -------------------------- + 4 linhas no conjunto 

Depois disso, volte para a primeira sessão e use a instrução UNLOCK TABLES para liberar o bloqueio. Depois de liberar o bloqueio READ da primeira sessão, execute a operação INSERT na segunda sessão.

Finalmente, verifique os dados na tabela tbl para ver se a operação INSERT na segunda sessão foi realmente executada.

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 10 | 2 | 20 + ---- + ----- + 2 linhas no conjunto 

ESCREVA o bloqueio da tabela MySQL

O bloqueio de mesa para WRITE tem as seguintes funções:

Apenas a sessão que possui o bloqueio da tabela pode ler e gravar dados da tabela.

Antes de liberar o bloqueio WRITE, outras sessões não podem ler ou escrever na tabela.

Saiba mais sobre o princípio de funcionamento dos bloqueios WRITE.

Primeiro, adquira um bloqueio WRITE da primeira sessão.

LOCK TABLE tbl WRITE; 

Em seguida, insira uma nova linha na tabela tbl.

INSERT INTO tbl (col) VALORES (11); 

Sem problemas, a instrução acima pode ser executada normalmente. Em seguida, leia os dados da tabela tbl.

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 10 | 2 | 20 | 3 | 11 + ---- + ----- + 3 linhas no conjunto 

Depois disso, abra uma segunda sessão conectada ao MySQL e tente escrever e ler os dados:

O MySQL coloca essas operações em um estado de espera. Você pode usar a instrução SHOW PROCESSLIST para visualizá-la na primeira sessão.

mysql> MOSTRAR LISTA DE PROCESSOS; + ---- + ------ + ----------------- + ---------- + -------- - + ------- + --------------------------------- + ------ --------------------------- + | Id | Usuário | Host | db | Command | Tempo | Estado | Info | + ---- + ------ + ----------------- + ---------- + -------- - + ------- + --------------------------------- + ------ --------------------------- + | 2 | root | localhost: 51998 | NULL | Dormir | 8477 | | NULL | | 3 | root | localhost: 51999 | yiibaidb | Dormir | 11636 | NULL | | 8 root | localhost: 54012 | testdb | Dormir | 119 | NULL | | 9 root | localhost: 54013 | testdb | Query | 0 | começando | MOSTRAR LISTA DE PROCESSOS | | 10 root | localhost: 54016 | testdb | Query | 49 Aguardando bloqueio de metadados da tabela | INSERIR EM tbl (col) VALORES (21) | + ---- + ------ + ----------------- + ---------- + -------- - + ------- + --------------------------------- + ------ --------------------------- + 5 linhas no conjunto 

Finalmente, libere o bloqueio da primeira sessão. Execute a seguinte declaração -

DESBLOQUEAR TABELAS; 

Depois de executar a instrução acima, você verá que todas as operações pendentes na segunda sessão foram executadas.

SELECT * FROM tbl; Consulta OK, 1 linha afetada + ---- + ----- + | id | col | + ---- + ----- + | 1 10 | 2 | 20 | 3 | 11 | 4 21 + ---- + ----- + 4 linhas no conjunto 

Neste tutorial, mostramos como bloquear e desbloquear: operações READ e WRITE para coordenar o acesso à tabela entre as sessões


 

Acho que você gosta

Origin blog.csdn.net/weixin_45713725/article/details/114581117
Recomendado
Clasificación