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

Como copiar dados de outra tabela sem travar a tabela no MYSQL 6.2?


Dado que as tabelas têm exatamente as mesmas colunas, você pode fazer algo assim:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
INSERT INTO NEW_TABLE (SELECT * FROM OLD_TABLE);
COMMIT ;

Incluí algumas explicações adicionais baseadas em Wistar's Comente. Os níveis de leitura que podem ser usados ​​aqui são:
  • LEIA COMPROMETIDA :Um nível de isolamento semelhante ao Oracle em relação a leituras consistentes (sem bloqueio):cada leitura consistente, mesmo dentro da mesma transação, define e lê seu próprio instantâneo atualizado
  • LEIA SEM COMPROMISSO :as instruções SELECT são executadas de maneira não-bloqueante, mas uma possível versão anterior de uma linha pode ser usada. Assim, usando este nível de isolamento, tais leituras não são consistentes. Isso também é chamado de leitura suja. Caso contrário, esse nível de isolamento funciona como READ COMMITTED.
  • LEITURA REPETÍVEL :Este é o nível de isolamento padrão para InnoDB. Para leituras consistentes, há uma diferença importante do nível de isolamento READ COMMITTED:Todas as leituras consistentes dentro da mesma transação leem o instantâneo estabelecido pela primeira leitura. Essa convenção significa que, se você emitir várias instruções SELECT simples (sem bloqueio) na mesma transação, essas instruções SELECT também serão consistentes entre si.
  • SERIALIZÁVEL :Este nível é como REPEATABLE READ, mas o InnoDB converte implicitamente todas as instruções SELECT simples para SELECT ... LOCK IN SHARE MODE se o autocommit estiver desabilitado. Se o autocommit estiver habilitado, o SELECT será sua própria transação. Portanto, é conhecido por ser somente leitura e pode ser serializado se executado como uma leitura consistente (sem bloqueio) e não precisa ser bloqueado para outras transações. (Para forçar um SELECT simples a bloquear se outras transações modificaram as linhas selecionadas, desative o autocommit.)

Eu espero que isso ajude.