Compartilhar via


Concorrência em nível de linha

A simultaneidade em nível de linha reduz conflitos entre operações de gravação simultâneas detectando alterações no nível da linha e resolvendo automaticamente conflitos que ocorrem quando gravações simultâneas atualizam ou excluem linhas diferentes no mesmo arquivo de dados.

Requisitos para concorrência de nível de linha

As tabelas não dão suporte à simultaneidade de nível de linha se tiverem partições definidas ou não tiverem vetores de exclusão habilitados. A simultaneidade de nível de linha requer o Databricks Runtime 14.2 ou superior.

Tabelas com partições não dão suporte à simultaneidade de nível de linha, mas ainda podem evitar conflitos entre OPTIMIZE e todas as outras operações de gravação quando os vetores de exclusão estão habilitados. Consulte Limitações de simultaneidade no nível de linha.

Para versões do Databricks Runtime anteriores à 14.2, consulte o comportamento de pré-visualização de concorrência no nível de linha (herdado).

Observação

MERGE INTO suporte para concorrência em nível de linha requer o Photon no Databricks Runtime 14.2. No Databricks Runtime 14.3 LTS e posteriores, o Photon não é necessário.

Matriz de conflitos com concorrência de 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 com simultaneidade de nível de linha habilitada:

INSERT (1) UPDATEEXCLUIRMERGE INTO OPTIMIZE
INSERT Não deve conflitar
UPDATEEXCLUIRMERGE INTO Não pode haver conflito em WriteSerializable. Pode entrar em conflito em Serializável ao modificar a mesma linha. Pode entrar em conflito ao modificar a mesma linha.
OPTIMIZE Não deve conflitar Pode entrar em conflito quando ZORDER BY é usado. Não é possível entrar em conflito de outra forma. Pode entrar em conflito quando ZORDER BY é usado. Não é possível entrar em conflito de outra forma.

(1) Todas as INSERT operações nesta tabela descrevem operações de apêndice que não leem dados da mesma tabela antes de serem efetivadas. As operações INSERT que contêm subconsultas que leem a mesma tabela dão suporte à mesma simultaneidade que MERGE.

Observação

  • Tabelas com colunas de identidade não dão suporte a transações simultâneas. Veja Usar colunas de identidade no Delta Lake.
  • REORG operações têm uma semântica de isolamento idêntica à OPTIMIZE quando reescrevem arquivos de dados. Quando você usa REORG para aplicar uma atualização, protocolos de tabela são alterados, o que entra em conflito com todas as operações em andamento.

Conflitos de gravação sem concorrência no nível de linha

As tabelas não dão suporte à simultaneidade no nível de linha se tiverem partições definidas ou não tiverem vetores de exclusão habilitados. O Databricks Runtime 14.2 ou superior é necessário para simultaneidade no nível de linha.

Matriz de conflitos sem concorrência de 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:

INSERT (1) UPDATEEXCLUIRMERGE INTO OPTIMIZE
INSERT Não deve conflitar
UPDATEEXCLUIRMERGE INTO Não pode haver conflito em WriteSerializable. Pode entrar em conflito em Serializável. Consulte Evitar conflitos usando particionamento. Pode entrar em conflito em Serializable e em WriteSerializable. Consulte Evitar conflitos usando particionamento.
OPTIMIZE Não deve conflitar Não é possível entrar em conflito em tabelas com vetores de exclusão habilitados, a menos que ZORDER BY seja usado. Pode entrar em conflito caso contrário. Não é possível entrar em conflito em tabelas com vetores de exclusão habilitados, a menos que ZORDER BY seja usado. Pode entrar em conflito caso contrário.

(1) Todas as INSERT operações nesta tabela descrevem operações de adição que não leem dados da mesma tabela antes de serem confirmadas. As operações INSERT que contêm subconsultas que leem a mesma tabela dão suporte à mesma simultaneidade que MERGE.

Observação

  • Tabelas com colunas de identidade não dão suporte a transações simultâneas. Veja Usar colunas de identidade no Delta Lake.
  • REORG operações têm semântica de isolamento idêntica a OPTIMIZE quando reescrevem arquivos de dados. Quando você usa REORG para aplicar uma atualização, protocolos de tabela são alterados, o que entra em conflito com todas as operações em andamento.

Limitações para simultaneidade no nível de linha

As limitações se aplicam à concorrência em nível de linha. Para as operações a seguir, a resolução de conflitos segue a simultaneidade normal para conflitos de gravação. Consulte Conflitos de gravação sem simultaneidade no nível de linha.

Limitation Descrição
Cláusulas condicionais complexas Condições em tipos de dados complexos (structs, matrizes, mapas), expressões não determinísticas, subconsultas e subconsultas correlacionadas
MERGE requisito de predicado No Databricks Runtime 14.2, MERGE os comandos devem usar um predicado explícito na tabela de destino para filtrar linhas correspondentes à tabela de origem
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 resolver a latência em vez dos conflitos.

Todas as limitações de vetores de exclusão também se aplicam. Confira Limitações.

Evitar conflitos usando particionamento

Para todos os casos marcados como "pode entrar em conflito" nas matrizes de conflito, um conflito ocorrerá somente se as duas operações afetarem o mesmo conjunto de arquivos. Para tornar dois conjuntos de arquivos desarticulados, particione a tabela pelas mesmas colunas usadas em condições de operação.

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 for particionada por data, pois ambos podem tentar modificar os mesmos arquivos. Particionando a tabela por date evita o conflito.

Observação

Particionar uma tabela por uma coluna com alta cardinalidade pode levar a problemas de desempenho devido ao grande número de subdiretórios.

Exemplo: evitando conflitos com filtros de partição explícitos

Essa exceção geralmente é gerada durante operações simultâneas DELETE, UPDATE, ou MERGE que podem ler a mesma partição mesmo ao atualizar partições diferentes. Torne a separação explícita na condição de 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ções, você observa uma das seguintes exceções:

ConcurrentAppendException

Essa exceção ocorre quando uma operação simultânea adiciona arquivos na mesma partição (ou em qualquer lugar em uma tabela não particionada) que sua operação lê. As adições de arquivo podem ser causadas por operações INSERT, DELETE, UPDATE ou MERGE.

Com o nível de isolamento padrão "WriteSerializable", os arquivos adicionados por operações cegas INSERT (operações que acrescentam dados sem ler nenhum dado) não entram em conflito com nenhuma operação. Se o nível de isolamento for Serializable, as inserções cegas poderão entrar em conflito.

Importante

Acréscimos cegos podem entrar em conflito no modo WriteSerializable se várias operações simultâneas DELETE, UPDATE ou MERGE puderem referenciar valores inseridos por acréscimos cegos. Para evitar isso:

  • Garanta que as operações simultâneas DELETE, UPDATE ou MERGE não leiam os dados acrescentados.
  • Ter, no máximo, uma operação DELETE, UPDATE ou MERGE que possa ler os dados acrescentados

ConcurrentDeleteReadException

Essa exceção ocorre quando uma operação simultânea exclui um arquivo que sua operação leu. As causas comuns são DELETE, UPDATEou MERGE operações que reescrevem arquivos.

ConcurrentDeleteDeleteException

Essa exceção ocorre quando uma operação simultânea exclui um arquivo que sua operação também exclui. Isso pode ser causado por duas operações de compactação simultâneas reescrevendo os mesmos arquivos.

MetadataChangedException

Essa exceção ocorre quando uma transação simultânea atualiza os metadados de uma tabela do Delta. Causas comuns são ALTER TABLE operações ou escritas que atualizam o esquema da tabela.

ConcurrentTransactionException

Essa exceção ocorre se um processo de consulta em streaming que utiliza o mesmo local de ponto de verificação for iniciado várias vezes simultaneamente e tentar gravar na tabela Delta ao mesmo tempo. Nunca execute duas consultas de streaming com o mesmo local de ponto de verificação simultaneamente.

ExceçãoDeAlteraçãoDeProtocolo

Essa exceção pode ocorrer quando:

  • Sua tabela Delta é atualizada para uma nova versão de protocolo (talvez seja necessário atualizar o 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 de recursos e protocolos do Delta Lake.

Comportamento de visualização prévia da simultaneidade a nível de linha (legado)

Esta seção descreve os comportamentos de pré-visualização para concorrência no nível de linha no Databricks Runtime 14.1 e nas versões anteriores.

Versão do Databricks Runtime Comportamento
Databricks Runtime 13.3 LTS e versões posteriores Tabelas com agregação líquida habilitam automaticamente a concorrência em nível de linha
Databricks Runtime 14.0 e 14.1 Habilitar simultaneidade de nível de linha para tabelas com vetores de exclusão usando a configuração abaixo
Databricks Runtime 14.1 e versões anteriores A computação não Photon suporta somente a simultaneidade de nível de linha para operações DELETE

Para habilitar a simultaneidade de nível de linha no Databricks Runtime 14.0 e 14.1:

spark.databricks.delta.rowLevelConcurrencyPreview = true

A concorrência no nível de linha sempre requer vetores de exclusão.

Próximas Etapas