L'émergence de grands entrepôts et flux de données (ETL, migrations) a nécessité non seulement de charger des centaines de milliers de lignes, mais aussi de garantir que les données soient soit complètement chargées, soit rien ne soit chargé. En SQL, cela se réalise par des opérations bulk atomiques à l'aide de transactions.
Lors d'une insertion massive (Bulk Insert), le risque d'erreur est accru — une seule ligne incorrecte peut gâcher tout le chargement ou conduire à une insertion partielle. Cela est inacceptable pour les systèmes financiers, logistiques et autres systèmes critiques.
La pratique consiste à envelopper l'opération bulk dans une transaction, à utiliser des commandes spéciales appropriées (BULK INSERT, COPY) et à capturer/journaliser les erreurs. Important : en cas d'erreur d'une ligne, toute le bloc est annulé :
Exemple pour SQL Server :
BEGIN TRAN; BULK INSERT Customers FROM 'C:\data\customers.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = ' ', FIRSTROW = 2 ); IF @@ERROR <> 0 ROLLBACK TRAN; ELSE COMMIT TRAN;
En PostgreSQL (exemple avec COPY) :
BEGIN; COPY products FROM '/tmp/products.csv' DELIMITER ',' CSV HEADER; COMMIT;
Caractéristiques clés :
La taille de la transaction lors de Bulk Insert affecte-t-elle les performances et les blocages ?
Oui, avec des volumes trop importants, il est possible d'obtenir un blocage prolongé, de saturer les journaux de transactions et de ralentir le serveur. Le mieux est de charger par lots (batch), par exemple 10 000 lignes par transaction.
Le Bulk Insert est-il toujours transactionnel par défaut dans tous les SGBD ?
Non, dans certains SGBD (par exemple, MySQL), la commande d'insertion massive n'est pas toujours automatiquement atomique — il est nécessaire de l'envelopper dans un BEGIN/COMMIT manuellement, sinon un chargement partiel est possible.
Peut-on garantir l'intégrité des clés étrangères lors d'une insertion massive ?
Oui, uniquement si l'ordre de chargement est respecté : d'abord les tables parentes, puis les tables enfants, ou en désactivant temporairement les contraintes. Une erreur de clé étrangère annulera toute la transaction d'insertion massive.
Lors du chargement des clients, un fichier avec une erreur sur une ligne a conduit à un chargement partiel — à la fin de la journée, la base de données et la source externe étaient désynchronisées.
Avantages :
Le fichier est préalablement vérifié pour des erreurs, les inserts massifs sont divisés en lots de 5 000 lignes, chaque lot dans sa propre transaction. Les journaux d'erreurs sont sauvegardés pour une analyse ultérieure.
Avantages :