Concorrência em nível de linha
A concorrência em nível de linha reduz conflitos entre operações de escrita concorrentes, detectando alterações em nível de linha e resolvendo automaticamente conflitos que ocorrem quando escritas concorrentes atualizam ou excluem linhas diferentes no mesmo arquivo de dados.
Requisitos para concorrência em nível de linha
A simultaneidade em nível de linha é ativada automaticamente quando todos os requisitos a seguir são atendidos:
- Utilizando Databricks Runtime 14.3 LTS e acima.
- A tabela de origem não utiliza partições.
- A tabela de origem tem vetores de exclusão ativados. Consulte Vetores de exclusão no Databricks.
Tabelas particionadas não permitem simultaneidade em nível de linha. No entanto, quando os vetores de exclusão estão ativados, tabelas particionadas ainda podem evitar conflitos entre OPTIMIZE e operações de gravação. Consulte Limitações para simultaneidade em nível de linha.
Para versões do Databricks Runtime anteriores a 14.3 LTS, consulte Comportamento Herdado de Simultaneidade em Nível de Linha.
Matriz de conflitos com concorrência em nível de linha
Para tabelas de origem com simultaneidade em nível de linha, a tabela a seguir mostra quais pares de operações de gravação podem entrar em conflito em cada nível de isolamento:
Operação | INSERIR (1) | UPDATE, EXCLUIR, MERGE INTO | OPTIMIZE |
|---|---|---|---|
INSERT | Não pode haver conflito | ||
UPDATE, EXCLUIR, MERGE INTO | Não pode haver conflito em WriteSerializable. Pode haver conflito em objetos Serializable ao modificar a mesma linha. | Pode haver conflito ao modificar a mesma linha. | |
OPTIMIZE | Não pode haver conflito | Pode haver conflito quando | Pode haver conflito quando |
(1) Todas as INSERT operações nesta tabela descrevem operações de anexação que não contêm subconsultas que leem dados da mesma tabela. INSERT operações que contêm subconsultas que leem da mesma tabela suportam a mesma concorrência que MERGE.
- Tabelas com colunas de identidade não oferecem suporte para transações concorrentes. Consulte Usar colunas de identidade no Delta Lake.
REORGAs operações têm semântica de isolamento idêntica aOPTIMIZEao reescrever arquivos de dados. Quando você usaREORGpara aplicar uma atualização, os protocolos da tabela mudam, o que entra em conflito com todas as operações em andamento.
Conflitos de gravação sem simultaneidade em nível de linha
Para tabelas de origem sem simultaneidade em nível de linha, a tabela a seguir mostra quais pares de operações de gravação podem entrar em conflito em cada nível de isolamento:
Operação | INSERIR (1) | UPDATE, EXCLUIR, MERGE INTO | OPTIMIZE |
|---|---|---|---|
INSERT | Não pode haver conflito | ||
UPDATE, EXCLUIR, MERGE INTO | Não pode haver conflito em WriteSerializable. Pode haver conflito em Serializable. Consulte Evitar conflitos usando particionamento. | Pode haver conflito entre Serializable e WriteSerializable. Consulte Evitar conflitos usando particionamento. | |
OPTIMIZE | Não pode haver conflito | Não pode haver conflito em tabelas com vetores de exclusão ativados, a menos que | Não pode haver conflito em tabelas com vetores de exclusão ativados, a menos que |
(1) Todas as INSERT operações nesta tabela descrevem operações de anexação que não contêm subconsultas que leem dados da mesma tabela. INSERT operações que contêm subconsultas que leem da mesma tabela suportam a mesma concorrência que MERGE.
- Tabelas com colunas de identidade não oferecem suporte para transações concorrentes. Consulte Usar colunas de identidade no Delta Lake.
REORGoperações têm semântica de isolamento idêntica aOPTIMIZEao reescrever arquivos de dados. Quando você usaREORGpara aplicar uma atualização, os protocolos da tabela mudam e entram em conflito com todas as operações em andamento.
Limitações para concorrência em nível de linha
Existem limitações para a concorrência em nível de linha. Para as operações a seguir, a resolução de conflitos segue a concorrência normal para conflitos de escrita. Consulte Conflitos de escrita sem concorrência em nível de linha.
Limitação | Descrição |
|---|---|
Cláusulas condicionais complexas | Condições em tipos de dados complexos (estruturas, arrays, mapas), expressões não determinísticas, subconsultas e subconsultas correlacionadas. |
| No Databricks Runtime 14.2, o comando |
Compensação de desempenho | A detecção de conflitos em nível de linha pode aumentar o tempo total de execução. Com muitas transações simultâneas, o escritor prioriza a latência em detrimento da resolução de conflitos. |
Todas as limitações para vetores de deleção também se aplicam. Consulte as limitações.
Evite conflitos usando particionamento.
Em todos os casos marcados como "pode haver conflito" nas matrizes de conflito, um conflito ocorre somente se as duas operações afetarem o mesmo conjunto de arquivos. Para tornar dois conjuntos de arquivos disjuntos, particione a tabela pelas mesmas colunas usadas nas condições das operações.
Exemplo:
Os comandos UPDATE table WHERE date > '2010-01-01' ... e DELETE table WHERE date < '2010-01-01' entram em conflito se a tabela não estiver particionada por data, porque ambos podem tentar modificar os mesmos arquivos. Particionar a tabela por date evita o conflito.
Particionar uma tabela por uma coluna com alta cardinalidade pode causar problemas de desempenho devido ao grande número de subdiretórios.
Evite conflitos com filtros de partição explícitos
Esta exceção é frequentemente gerada durante operações concorrentes DELETE, UPDATE ou MERGE que podem ler a mesma partição, mesmo ao atualizar partições diferentes. Tornar a separação explícita na condição da operação:
// Problem: Condition can scan the entire table
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
// Solution: Add explicit partition filters
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country AND t.date = '" + date + "' AND t.country = '" + country + "'")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
Exceções de conflito
Quando ocorre um conflito de transação, você observa uma das seguintes exceções:
Exceção de Aplicação Concorrente
Essa exceção ocorre quando uma operação concorrente adiciona arquivos na mesma partição (ou em qualquer lugar em uma tabela não particionada) que sua operação está lendo. As adições de arquivos podem ser causadas por operações INSERT, DELETE, UPDATE ou MERGE .
Com o nível de isolamento default WriteSerializable, arquivos adicionados por INSERT operações que anexam dados sem ler nenhum dado não entram em conflito com nenhuma operação. Se o nível de isolamento for serializável, quaisquer anexações podem entrar em conflito.
INSERT Operações podem entrar em conflito no modo WriteSerializable se múltiplas operações concorrentes DELETE, UPDATE ou MERGE puderem referenciar valores anexados pela operação INSERT. Para evitar isso:
- Garanta que as operações concorrentes
DELETE,UPDATEouMERGEnão leiam os dados anexados. - Tenha no máximo uma
DELETE,UPDATEouMERGEoperações que podem ler os dados anexados.
Exceção Concorrente de Exclusão de Leitura
Esta exceção ocorre quando uma operação concorrente exclui um arquivo que sua operação leu. As causas comuns são operações DELETE, UPDATE ou MERGE que reescrevem arquivos.
Exceção Concorrente de Exclusão
Esta exceção ocorre quando uma operação concorrente exclui um arquivo que sua operação também exclui. Isso pode ser causado por duas operações de compactação simultâneas que reescrevem os mesmos arquivos.
Exceção MetadataChangedException
Essa exceção ocorre quando uma transação concorrente atualiza os metadados de uma tabela Delta . As causas comuns são operações ALTER TABLE ou gravações que atualizam o esquema da tabela.
Exceção de transação simultânea
Essa exceção ocorre se uma consulta de transmissão que utiliza o mesmo local de ponto de verificação for iniciada várias vezes simultaneamente e tentar gravar na tabela Delta ao mesmo tempo. Nunca execute duas consultas de transmissão com a mesma localização de checkpoint simultaneamente.
Exceção ProtocolChangedException
Essa exceção pode ocorrer quando:
- Sua tabela Delta Lake é atualizada para uma nova versão de protocolo (talvez seja necessário atualizar seu Databricks Runtime)
- Vários escritores estão criando ou substituindo uma tabela ao mesmo tempo.
- Vários escritores estão escrevendo em um caminho vazio ao mesmo tempo.
Consulte a compatibilidade e os protocolos de recursosDelta Lake.
Comportamento legado de simultaneidade em nível de linha
No Databricks Runtime 13.3 LTS, a simultaneidade em nível de linha usa o comportamento herdado:
- Requer vetores de exclusão. Consulte Vetores de exclusão no Databricks.
- Tabelas com clustering líquido habilitam automaticamente a simultaneidade em nível de linha.