Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La concurrence au niveau des lignes réduit les conflits entre les opérations d’écriture simultanées en détectant les modifications au niveau des lignes et en résolvant automatiquement les conflits qui se produisent lorsque des écritures simultanées mettent à jour ou suppriment des lignes différentes dans le même fichier de données.
Exigences pour la concurrence au niveau des lignes
La concurrence au niveau des lignes est automatiquement activée lorsque toutes les conditions suivantes sont remplies :
- Utilisation de Databricks Runtime 14.3 LTS et versions ultérieures.
- La table source n’utilise pas de partitions.
- La table source a des vecteurs de suppression activés. Consultez les vecteurs de suppression dans Databricks.
Les tables partitionnée n’autorisent pas la concurrence au niveau des lignes. Toutefois, lorsque des vecteurs de suppression sont activés, les tables partitionnées peuvent toujours éviter les conflits entre OPTIMIZE et les opérations d’écriture. Consultez Limitations pour la concurrence au niveau de ligne.
Pour les versions de Databricks Runtime antérieures à 14.3 LTS, consultez le comportement hérité de la concurrence au niveau des lignes.
Matrice de conflit avec concurrence au niveau des lignes
Pour les tables sources avec concurrence au niveau des lignes, le tableau suivant montre comment chaque paire d’opérations d’écriture concurrentes se comporte à chaque niveau d’isolement.
Les modifications concurrentes des métadonnées sont une exception à chaque résultat du tableau. Un changement de métadonnées, tel qu’une ALTER TABLE commande ou une écriture qui met à jour le schéma de la table, peut provoquer l’échec de toutes les opérations d’écriture simultanées, y compris INSERT. Voir Conflits de changements de métadonnées.
| Paire d’opérations | WriteSerializable (par défaut) | Sérialisable |
|---|---|---|
| INSERT (1) + INSERT | Ne peut pas entrer en conflit | Ne peut pas entrer en conflit |
| INSERT + UPDATE, SUPPRIMER, MERGE INTO | Ne peut pas entrer en conflit | Peut entrer en conflit lors de la modification d’une même ligne. Le UPDATE, , ou MERGE l’opération échoue, pas le INSERTDELETE. |
| INSERT + OPTIMIZE | Ne peut pas entrer en conflit | Ne peut pas entrer en conflit |
| UPDATE, SUPPRIMER, MERGE INTO + UPDATE, SUPPRIMER, MERGE INTO | Conflit possible lors de la modification d’une même ligne | Conflit possible lors de la modification d’une même ligne |
| UPDATE, SUPPRIMER, MERGE INTO + OPTIMIZE | Peut entrer en conflit lorsque vous utilisez ZORDER BY. Ne peut pas entrer en conflit dans le cas contraire. |
Peut entrer en conflit lorsque vous utilisez ZORDER BY. Ne peut pas entrer en conflit dans le cas contraire. |
| OPTIMIZE + OPTIMIZE | Peut entrer en conflit lorsque vous utilisez ZORDER BY. Ne peut pas entrer en conflit dans le cas contraire. |
Peut entrer en conflit lorsque vous utilisez ZORDER BY. Ne peut pas entrer en conflit dans le cas contraire. |
(1) Toutes les opérations de cette table décrivent les INSERT opérations d’ajout qui ne contiennent pas de sous-requêtes qui lisent les données de la même table. Les opérations INSERT contenant des sous-requêtes qui lisent la même table prennent en charge le même niveau de concurrence que MERGE.
Note
- Lorsqu’une paire peut entrer en conflit, seule l’opération qui lit les données affectées échoue. Un qui ajoute des données sans lire la table n’est pas l’opération qui échoue, donc la
INSERTlogique de réessai appartient à la concurrenteUPDATE,DELETE, ouMERGE. - Les tables avec des colonnes d’identité ne prennent pas en charge les transactions simultanées. Consultez les colonnes d’identité.
-
REORGles opérations ont une sémantique d’isolation identique àOPTIMIZElors de la réécriture des fichiers de données. Lorsque vous utilisezREORGpour appliquer une mise à niveau, les protocoles de table changent, ce qui crée un conflit avec toutes les opérations en cours.
Conflits d’écriture sans concurrence au niveau des lignes
Pour les tables sources sans concurrence au niveau des lignes, le tableau suivant montre comment chaque paire d’opérations d’écriture concurrentes se comporte à chaque niveau d’isolement.
Les modifications concurrentes des métadonnées sont une exception à chaque résultat du tableau. Un changement de métadonnées, tel qu’une ALTER TABLE commande ou une écriture qui met à jour le schéma de la table, peut provoquer l’échec de toutes les opérations d’écriture simultanées, y compris INSERT. Voir Conflits de changements de métadonnées.
| Paire d’opérations | WriteSerializable (par défaut) | Sérialisable |
|---|---|---|
| INSERT (1) + INSERT | Ne peut pas entrer en conflit | Ne peut pas entrer en conflit |
| INSERT + UPDATE, SUPPRIMER, MERGE INTO | Ne peut pas entrer en conflit | Ça peut entrer en conflit. Le UPDATE, , ou MERGE l’opération échoue, pas le INSERTDELETE. Consultez Éviter les conflits à l’aide du partitionnement. |
| INSERT + OPTIMIZE | Ne peut pas entrer en conflit | Ne peut pas entrer en conflit |
| UPDATE, SUPPRIMER, MERGE INTO + UPDATE, SUPPRIMER, MERGE INTO | Ça peut entrer en conflit. Consultez Éviter les conflits à l’aide du partitionnement. | Ça peut entrer en conflit. Consultez Éviter les conflits à l’aide du partitionnement. |
| UPDATE, SUPPRIMER, MERGE INTO + OPTIMIZE | Impossible d'entrer en conflit dans les tables avec des vecteurs de suppression activés, à moins que ZORDER BY ne soit utilisé. Sinon, des conflits peuvent survenir. |
Impossible d'entrer en conflit dans les tables avec des vecteurs de suppression activés, à moins que ZORDER BY ne soit utilisé. Sinon, des conflits peuvent survenir. |
| OPTIMIZE + OPTIMIZE | Impossible d'entrer en conflit dans les tables avec des vecteurs de suppression activés, à moins que ZORDER BY ne soit utilisé. Sinon, des conflits peuvent survenir. |
Impossible d'entrer en conflit dans les tables avec des vecteurs de suppression activés, à moins que ZORDER BY ne soit utilisé. Sinon, des conflits peuvent survenir. |
(1) Toutes les opérations de cette table décrivent les INSERT opérations d’ajout qui ne contiennent pas de sous-requêtes qui lisent les données de la même table. Les opérations INSERT contenant des sous-requêtes qui lisent la même table prennent en charge le même niveau de concurrence que MERGE.
Note
- Lorsqu’une paire peut entrer en conflit, seule l’opération qui lit les données affectées échoue. Un qui ajoute des données sans lire la table n’est pas l’opération qui échoue, donc la
INSERTlogique de réessai appartient à la concurrenteUPDATE,DELETE, ouMERGE. - Les tables avec des colonnes d’identité ne prennent pas en charge les transactions simultanées. Consultez les colonnes d’identité.
-
REORGles opérations ont une sémantique d’isolation identique àOPTIMIZElors de la réécriture des fichiers de données. Lorsque vous utilisezREORGpour appliquer une mise à niveau, les protocoles de table changent et entrent en conflit avec toutes les opérations en cours.
Limitations pour la concurrence au niveau des lignes
Les limitations s’appliquent à la concurrence au niveau des lignes. Pour les opérations suivantes, la résolution des conflits suit le comportement standard des conflits d’écriture. Consultez Conflits d’écriture sans concurrence au niveau des lignes.
| Limitation | Description |
|---|---|
| Clauses conditionnelles complexes | Conditions sur les types de données complexes (structs, tableaux, cartes), expressions non déterministes, sous-requêtes et sous-requêtes corrélées |
Exigence de prédicat MERGE |
Dans Databricks Runtime 14.2, MERGE les commandes doivent utiliser un prédicat explicite sur la table cible pour filtrer les lignes correspondant à la table source |
| Compromis de performance | La détection des conflits au niveau des lignes peut augmenter le temps d’exécution total. Avec de nombreuses transactions concurrentes, le système d’écriture privilégie la latence au détriment de la résolution des conflits. |
Toutes les limitations des vecteurs de suppression s’appliquent également. Consultez Limitations.
Éviter les conflits à l’aide du partitionnement
Pour tous les cas marqués « peut conflit » dans les matrices de conflit, un conflit se produit uniquement si les deux opérations affectent le même ensemble de fichiers. Pour rendre disjoints deux ensembles de fichiers, partitionnez la table avec les mêmes colonnes utilisées dans les conditions d'opération.
Exemple :
Les commandes UPDATE table WHERE date > '2010-01-01' ... et DELETE table WHERE date < '2010-01-01' sont en conflit si la table n’est pas partitionnée par date, puisque les deux peuvent tenter de modifier les mêmes fichiers. Le partitionnement de la table par date permet d'éviter le conflit.
Note
Le partitionnement d’une table par une colonne avec une cardinalité élevée peut entraîner des problèmes de performances en raison du grand nombre de sous-répertoires.
Éviter les conflits avec les filtres de partition explicites
Cette exception est souvent déclenchée lors d’opérations simultanées DELETE, UPDATE ou MERGE susceptibles de lire la même partition, même lorsqu’elles mettent à jour des partitions différentes. Rendez la séparation explicite dans la condition d’opération :
// 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()
Exceptions de conflit
Lorsqu’un conflit de transaction se produit, vous observez l’une des exceptions suivantes :
Exception d'ajout simultané (ConcurrentAppendException)
Cette exception se produit lorsqu’une opération simultanée ajoute des fichiers dans la même partition (ou n’importe où dans une table non partitionnée) que celle que votre opération lit. Les ajouts de fichiers peuvent être causés par des opérations INSERT, DELETE, UPDATE ou MERGE.
Avec le niveau d’isolation WriteSerializable par défaut, les fichiers ajoutés par les opérations INSERT qui ajoutent des données sans en lire n’entrent en conflit avec aucune opération. Si le niveau d’isolation est sérialisable, les opérations d’ajout peuvent entrer en conflit.
Important
Un conflit peut toujours survenir en mode WriteSerialiable si plusieurs opérations concurrentes DELETE, UPDATE, ou MERGE des opérations peuvent référencer les valeurs ajoutées par une INSERT opération. L’opération DELETE, UPDATE, ou MERGE opération est celle qui échoue, car elle lit les données ajoutées. Pour éviter cela :
- Vérifiez que les opérations simultanées
DELETEUPDATEouMERGEne lisent pas les données ajoutées - Limitez-vous à une seule opération
DELETE,UPDATEouMERGEsusceptible de lire ces données ajoutées
ConcurrentDeleteReadException
Cette exception se produit lorsqu’une opération simultanée supprime un fichier lu par votre opération. Les causes courantes sont DELETE, UPDATEou MERGE les opérations qui réécrire des fichiers.
ConcurrentDeleteDeleteException
Cette exception se produit lorsqu’une opération simultanée supprime un fichier que votre opération supprime également. Cela peut être dû au fait que deux opérations de compression simultanées réécrivent les mêmes fichiers.
MetadataChangedException
Cette exception se produit lorsqu’une transaction concurrente met à jour les métadonnées d’une table Delta Lake. Les causes courantes incluent des opérations ALTER TABLE ou des écritures qui modifient le schéma de la table.
ConcurrentTransactionException
Cette exception se produit si une requête en streaming utilisant le même point de contrôle est lancée plusieurs fois simultanément et tente d’écrire simultanément sur la table Delta Lake. N’exécutez jamais deux requêtes de streaming avec le même emplacement de point de contrôle simultanément.
ProtocolChangedException (Exception de changement de protocole)
Cette exception peut se produire lorsque :
- Votre table Delta Lake est mise à niveau vers une nouvelle version de protocole (vous devrez peut-être mettre à niveau votre Databricks Runtime)
- Plusieurs enregistreurs créent ou remplacent une table au même moment
- Plusieurs enregistreurs écrivent en même temps dans un chemin d’accès vide
Consultez les protocoles et la compatibilité des fonctionnalités Delta Lake.
Comportement hérité de la concurrence au niveau des lignes
Dans Databricks Runtime 13.3 LTS, la concurrence au niveau des lignes utilise le comportement hérité :
- Nécessite des vecteurs de suppression. Consultez les vecteurs de suppression dans Databricks.
- Les tables avec clustering liquide activent automatiquement la concurrence au niveau des lignes.