Nhập hàng loạt an toàn: Xem trước, Xác thực, rồi Áp dụng
Nhập hàng loạt an toàn giúp bạn tránh dữ liệu sai và thay đổi bất ngờ. Dùng quy trình xem trước, xác thực, xử lý lỗi theo dòng và các cách commit dễ hoàn tác.

Tại sao thay đổi hàng loạt hay sai (và người dùng mong đợi gì)
Các thay đổi hàng loạt hỏng vì những lý do đời thường. File gần như đúng, nhưng tên cột sai. Một vài dòng thiếu trường bắt buộc. ID không khớp với dữ liệu trong cơ sở vì ai đó đã xuất file tuần trước và bản ghi đã thay đổi. Hoặc dữ liệu đúng nhưng map vào cột sai, nên số điện thoại rơi vào cột ghi chú.
Điều làm chuyện này đáng sợ là tốc độ. Một giả định sai có thể ảnh hưởng đến hàng trăm hay hàng nghìn bản ghi trước khi ai đó nhận ra. Nhập hàng loạt an toàn không chỉ là bài toán backend — đó là bài toán niềm tin.
Người dùng chỉ mong một điều đơn giản: cho tôi thấy sẽ xảy ra gì trước khi nó xảy ra. Mẫu đáng tin nhất là xem trước, xác thực, rồi áp dụng.
- Xem trước: hiển thị tóm tắt rõ ràng và mẫu các thay đổi thực tế.
- Xác thực: chạy các luật bắt lỗi trường thiếu, định dạng sai, và tham chiếu không khớp.
- Áp dụng: thực hiện thay đổi chỉ sau khi người dùng xác nhận, theo cách phù hợp với mức rủi ro.
Người dùng cũng mong được bảo vệ khỏi hai loại lỗi.
Vấn đề có thể sửa nên xử lý theo từng dòng. Nếu 12 dòng có định dạng email không hợp lệ hoặc thiếu mã ZIP, người dùng muốn sửa các dòng đó (tải báo cáo, sửa trực tiếp, hoặc tải lại) và giữ phần còn lại sẵn sàng.
Vấn đề chặn nên dừng toàn bộ. Nếu mapping sai, import sẽ ghi đè các trường then chốt, hoặc file thuộc workspace/khách hàng sai, trải nghiệm tốt nhất là dừng cứng kèm giải thích rõ ràng.
Người dùng cũng muốn dấu vết: một run ID, thời gian, ai chạy, file nào dùng, những gì thay đổi và những gì lỗi. Đó là thứ giúp support nhanh hơn và cho phép khôi phục khi có sự cố.
Luồng xem trước — xác thực — áp dụng, nói ngắn gọn
Thay đổi hàng loạt khiến lo lắng vì một cú click có thể chạm hàng nghìn bản ghi. Cách đơn giản nhất để giảm rủi ro là chia công việc thành ba giai đoạn, mỗi giai đoạn có đầu ra riêng.
Giai đoạn 1: Xem trước (chuẩn bị batch)
Lấy đầu vào (CSV, dán hàng, chọn bản ghi) và biến nó thành một batch đã chuẩn bị. Nhiệm vụ ở đây là cho thấy hệ thống nghĩ sẽ xảy ra gì, trước khi có bất kỳ thay đổi nào.
Một preview tốt trả lời ba câu hỏi: sẽ thay đổi gì, có bao nhiêu mục bị ảnh hưởng, và điều gì trông đáng ngờ.
Tối thiểu, nên bao gồm các số đếm (tổng dòng, bản ghi khớp, bản ghi mới, dòng bị bỏ qua), một mẫu nhỏ các dòng thực, và cảnh báo rõ ràng cho bất cứ thứ gì rủi ro (trường bắt buộc thiếu, khớp mơ hồ, giá trị bất thường). Cũng hãy làm rõ quy tắc khớp (ví dụ “khớp theo email” hoặc “khớp theo external ID”), và đặt cho batch một định danh: tên, dấu thời gian và batch ID duy nhất.
Giai đoạn 2: Xác thực (chạy thử)
Chạy thử (dry run) nghĩa là không ghi gì vào cơ sở dữ liệu. Chạy cùng các kiểm tra bạn sẽ dùng khi cập nhật thật, nhưng chỉ sinh báo cáo.
Xác thực nên bao gồm cả quy tắc theo dòng (dòng này hợp lệ chứ?) và quy tắc xuyên-dòng (các dòng này có mâu thuẫn với nhau không?). Đầu ra không nên là một thông báo mơ hồ đậu/rớt. Nó nên là bản tóm tắt cộng danh sách vấn đề gắn với dòng cụ thể, để người ta sửa mà không phải đoán mò.
Giai đoạn 3: Áp dụng (thực hiện thay đổi)
Áp dụng là bước không thể đảo ngược, nên chỉ cho phép sau khi chạy thử thành công. Người dùng không xác nhận “file.” Họ xác nhận một batch đã được xem trước và xác thực.
Điểm quyết định này quan trọng. Nếu file thay đổi, mapping thay đổi, hoặc dữ liệu được tải lại, hãy tạo batch mới và yêu cầu xác nhận lại.
Ví dụ: bạn import 5.000 khách hàng. Preview cho thấy 4.920 khớp theo email, 60 bản ghi mới, 20 dòng bị bỏ qua vì thiếu email. Dry run báo 12 dòng có định dạng điện thoại không hợp lệ. Chỉ sau khi 12 dòng đó được sửa, nút “Commit batch” mới khả dụng cho đúng batch ID đó.
Đầu vào, mapping và cách nhận diện bản ghi
Nhiều job hàng loạt lỗi ngay cả trước khi xác thực bắt đầu. Đầu vào lộn xộn, cột không khớp trường của bạn, hoặc hệ thống không biết dòng nên tạo mới hay cập nhật bản ghi cũ.
Thao tác hàng loạt thường bắt đầu từ export CSV, dán hàng của spreadsheet, chọn bản ghi trong app (mass update), hoặc job batch qua API. Dù nguồn nào, bạn cần mapping rõ ràng từ “những gì người dùng có” sang “những gì hệ thống lưu”.
Mapping nên bao gồm khớp cột->trường, biến đổi nhỏ (loại bớt khoảng trắng, parse ngày, chuẩn hoá số điện thoại) và giá trị mặc định cho ô trống. Đừng giấu hành vi khi một cột trống. Người dùng cần biết ô trống sẽ giữ giá trị hiện tại, xoá giá trị hay áp default.
Nhận diện là quyết định lớn tiếp theo: làm sao bạn khớp mỗi dòng với bản ghi hiện có?
Ưu tiên ID ổn định, và rõ ràng chuyện gì xảy ra khi không khớp hoặc khớp nhiều bản ghi. Các lựa chọn phổ biến gồm ID nội bộ (tốt nhất nếu người dùng có thể export), external ID (tốt cho tích hợp), và email (hữu ích nhưng phải cẩn thận trùng và chữ hoa chữ thường). Đôi khi khóa tổ hợp hợp lý, như account_id + invoice_number. Có khi bạn cung cấp chế độ “chỉ tạo” luôn tạo bản ghi mới.
Cuối cùng, áp các quy tắc phân quyền ở quy mô lớn. Người có quyền sửa một bản ghi không nên mặc nhiên có thể cập nhật mọi trường trên hàng nghìn bản ghi. Quyết định vai trò nào được chạy import, trường nào được phép thay đổi và khi nào cần phê duyệt bổ sung.
Thiết kế preview để xây dựng niềm tin
Preview là nơi người dùng quyết định có dám bấm “Áp dụng” hay không. Nếu preview mơ hồ, người dùng cho rằng hệ thống đang đoán. Một preview tốt đọc như hoá đơn: sẽ thay đổi gì, hệ thống tự tin thế nào, và điều gì sẽ chặn cập nhật.
Bắt đầu bằng một bản tóm tắt chặt chẽ. Hầu hết người dùng chỉ cần vài con số để định hướng: tổng dòng, bao nhiêu sẽ bị bỏ qua, tạo vs cập nhật (và xóa nếu cho phép), bao nhiêu dòng có cảnh báo vs lỗi nặng, và quy tắc khớp được dùng (ví dụ “khớp theo email”). Nếu được, gom các loại cảnh báo phổ biến để người dùng thấy mẫu nhanh.
Rồi cho phép người ta spot-check dữ liệu thực. Hiển thị một mẫu nhỏ có thể cuộn và gồm view trước-và-sau cho các cập nhật. Thấy “giá trị cũ -> giá trị mới” giúp tránh bị bất ngờ như số điện thoại bị ghi đè bằng ô trống. Một UI thực tế là hiển thị 10–50 dòng với tìm kiếm và bộ lọc (ví dụ “chỉ cảnh báo”), trong khi xử lý toàn file ở nền.
Sự không chắc chắn nên được hiển thị. Nếu một dòng có thể khớp nhiều bản ghi, nói rõ và hiển thị các ứng viên. Nếu trường bắt buộc trống, trỏ vào ô chính xác. Nếu import tạo trùng lặp, nêu lý do ngắn (ví dụ “email xuất hiện hai lần trong file”). Người dùng tin hệ thống hơn khi nó thừa nhận những gì nó không biết.
Cũng hãy làm rõ các hành động tiếp theo. Người dùng nên có thể tải báo cáo lỗi kèm số dòng và thông điệp chính xác, sửa rồi tải lại mà không phải dựng lại mapping, huỷ mà không thay đổi gì, hoặc tiến hành chỉ khi rủi ro thấp và họ có quyền.
Luật xác thực giúp bắt lỗi sớm
Xác thực tốt là thứ khiến nhập hàng loạt trở nên bình tĩnh chứ không rủi ro. Mục tiêu là tìm vấn đề trước khi có gì bị thay đổi, và giải thích sao cho người ta có thể sửa.
Chia xác thực theo loại rõ ràng
Một thông báo “không hợp lệ” lớn sẽ gây nhầm lẫn. Xử các kiểm tra thành các nhóm vì mỗi nhóm gợi ý cách sửa khác nhau.
Kiểm tra định dạng bao gồm kiểu dữ liệu, định dạng ngày, phạm vi số và mẫu phone/email. Kiểm tra trường bắt buộc bắt các giá trị thiếu, chuỗi rỗng và các trường hợp mơ hồ như 0 vs blank. Kiểm tra tham chiếu xác minh ID tồn tại và trạng thái được phép. Luật nghiệp vụ áp các ràng buộc thực tế: hạn mức tín dụng, phân quyền, hoặc “không thể đóng đơn khi còn item mở.”
Một quy tắc quan trọng: xác thực phải dùng cùng logic như khi commit. Nếu preview và commit theo luật khác nhau, người dùng sẽ mất niềm tin nhanh chóng. Tái sử dụng cùng bộ validator, cùng lookup dữ liệu và cùng kiểm tra quyền xuyên suốt.
Làm cho xác thực nhanh và dự đoán được
File lớn có thể tốn thời gian, nên xác thực cần cảm giác phản hồi. Xác thực theo từng khối (ví dụ 500–2.000 dòng), hiển thị tiến độ và ước lượng thời gian, và cache dữ liệu tham chiếu để không lặp fetch cùng danh sách ID hợp lệ.
Quy tắc xuyên-dòng cần được chú ý vì phải nhìn toàn file. Ví dụ phổ biến là trùng lặp trong file (cùng email xuất hiện hai lần) hoặc xung đột (hai dòng cố gắng đặt giá trị khác nhau cho cùng một bản ghi). Xây một chỉ mục nhẹ khi parsing, rồi đánh dấu cả hai dòng liên quan để người dùng chọn giữ dòng nào.
Lỗi theo hàng: làm cho chúng dễ hành động, không đáng sợ
Lỗi theo hàng là nơi giành được hay mất niềm tin. Một wall toàn chữ đỏ khiến người dùng dừng lại. Các mục rõ ràng, có thể sửa giữ họ tiếp tục.
Bắt đầu bằng việc phân tách mức độ. Lỗi chặn nghĩa là dòng không thể áp dụng như hiện tại (thiếu trường bắt buộc, định dạng sai, không tìm thấy bản ghi). Cảnh báo nghĩa là dòng có thể áp dụng nhưng người dùng nên chọn (giá trị sẽ bị trim, mặc định sẽ được dùng, có khả năng trùng lặp).
Phản hồi theo hàng tốt là cụ thể và có thể lặp lại. Mỗi vấn đề nên kèm một định danh dòng (số dòng trong file cộng một khóa ổn định như email hoặc external ID), tên trường (cột và trường đích), một thông điệp đơn giản (“Phone phải theo định dạng E.164,” không phải “Validation failed”), và gợi ý sửa (ví dụ giá trị hợp lệ hoặc phạm vi). Giữ tag mức độ nhất quán.
Thành công một phần nên là lựa chọn có chủ ý, không phải tai nạn. Chỉ cho phép khi các dòng độc lập và kết quả không tạo trạng thái hỏng. Cập nhật tag khách hàng có thể làm một phần. Cập nhật hoá đơn và các dòng item thường không nên.
Lên kế hoạch cho thử lại như một phần UX. Người dùng nên sửa file nguồn và chạy lại mà không phải làm lại mapping và không mất ngữ cảnh. Một mẫu thực tế là giữ một record “import run” lưu lựa chọn mapping và kết quả theo dòng, để lần chạy kế tiếp có thể đánh dấu “vẫn lỗi” vs “đã sửa”.
Mẫu commit: nguyên tử, từng phần và idempotent
Bước commit là nơi nhập hàng loạt được tin tưởng hoặc phá vỡ. Người dùng đã thấy preview và sửa lỗi. Giờ họ mong hệ thống áp đúng những gì đã xác thực.
Chọn chế độ commit và nêu rõ luật từ đầu
Có hai chế độ commit phổ biến, và cả hai đều tốt nếu luật được rõ ràng.
Atomic (tất cả hoặc không) nghĩa là nếu bất kỳ dòng nào lỗi, không có gì được ghi. Tốt cho tiền, tồn kho, phân quyền và bất cứ thứ gì cần nhất quán. Partial (nỗ lực tốt nhất) nghĩa là các dòng hợp lệ được áp, dòng lỗi bị bỏ và báo cáo. Thường phù hợp cho CRM hoặc enrich profile. Một số team dùng ngưỡng lai: chỉ commit nếu thất bại dưới tỉ lệ nhất định (ví dụ dừng nếu >2% thất bại).
Dù chọn gì, hãy hiển thị rõ ở màn hình commit và trong bản tóm tắt cuối.
Ràng buộc commit với đúng batch đã xác thực
Dùng job ID (batch ID) tạo lúc preview. Yêu cầu commit phải tham chiếu ID đó, không re-upload dữ liệu.
Điều này ngăn lỗi phổ biến: ai đó xem trước một file, rồi upload file khác, rồi bấm commit. Nó cũng hữu ích khi nhiều admin làm việc đồng thời.
Idempotency: chống áp dụng đôi
Người ta click hai lần. Trình duyệt retry. Tabs refresh. Commit phải an toàn khi chạy hai lần.
Cách đơn giản là idempotency: dùng key idempotent cho mỗi job (và từng dòng khi cần), dùng upsert khi mô hình dữ liệu cho phép, và khoá trạng thái job để nó chỉ chuyển từ Validated -> Committing -> Committed một lần duy nhất.
Ghi nhận kết quả như hoá đơn
Sau commit, hiển thị bản tóm tắt gọn và cho phép tải hoặc sao chép kết quả. Bao gồm số tạo, cập nhật, bỏ qua và thất bại, kèm lý do ngắn. Điều này biến một thay đổi lớn thành thứ người dùng có thể kiểm tra và giải thích.
Kế hoạch hoàn tác hoạt động trong thực tế
Kế hoạch hoàn tác biến import từ “hy vọng mọi thứ ổn” thành thứ bạn có thể chạy lại vào sáng thứ Hai. Nếu kết quả sai, bạn nên quay về trạng thái trước mà không phải đoán những gì đã thay đổi.
Cách đúng phụ thuộc vào kích thước batch, thời gian thực hiện và việc có tác động hệ thống ngoài (email, thanh toán, thông báo) mà không thể rút lại.
Ba cách hoàn tác thực tế
Với batch nhỏ và chạy nhanh, một transaction cơ sở dữ liệu là mạng lưới an toàn đơn giản nhất. Áp tất cả thay đổi, và nếu bất kỳ bước nào lỗi, DB huỷ hết. Phù hợp cho vài trăm đến vài nghìn dòng khi bạn chỉ cập nhật bảng PostgreSQL của mình.
Với imports lớn, staging-first an toàn hơn. Load file vào bảng staged, xác thực ở đó, rồi mới promote dữ liệu staged vào bảng production. Nếu thấy sai, drop dữ liệu staged và production không bị động chạm. Cách này cũng làm retry dễ hơn vì bạn giữ dataset staged và điều chỉnh mapping hay luật mà không cần tải lại.
Khi rollback thực sự không khả thi, lập kế hoạch hành động bù trừ. Nếu bulk update kích hoạt email hoặc thanh toán, bạn không thể quay ngược thời gian. Kế hoạch undo có thể là “đánh dấu bản ghi bị huỷ”, “hoàn tiền”, hoặc “gửi thông báo đính chính.” Xác định bước undo trước khi chạy job, không phải sau.
Một cách đơn giản để chọn:
- Dùng transaction khi batch nhỏ và bạn chỉ chạm DB của mình.
- Dùng staging và promotion khi batch lớn, chậm hoặc rủi ro cao.
- Dùng hành động bù trừ khi bạn kích hoạt side-effect bên ngoài.
- Luôn có kế hoạch chạy lại lặp lại sao cho cùng đầu vào không bị áp dụng đôi.
Audit log làm cho rollback có thể thực hiện được
Rollback phụ thuộc vào việc biết chính xác đã xảy ra gì. Ghi lại ai chạy job, khi nào, source file hay job ID, và bản ghi nào thay đổi (giá trị trước/sau, hoặc ít nhất là tóm tắt thay đổi).
Ví dụ cụ thể: một lead support bulk-update trạng thái 5.000 khách hàng. Với staging, họ phát hiện 200 dòng không khớp trước khi promote. Nếu vẫn commit và sau đó nhận ra mapping bị đảo, audit log cho phép họ chạy revert mục tiêu chỉ cho các bản ghi ảnh hưởng thay vì rollback toàn hệ thống.
Những sai lầm phổ biến và bẫy cần tránh
Bulk job lỗi theo cách có thể dự đoán. Hầu hết vấn đề không phải “dữ liệu xấu,” mà là kỳ vọng lệch nhau: người dùng nghĩ một điều, hệ thống làm điều khác.
Một bẫy lớn là xác thực theo một bộ luật và commit theo bộ luật khác. Chuyện này xảy ra khi preview dùng kiểm tra nhanh (hoặc service khác) và đường commit có thêm ràng buộc hoặc default khác. Người dùng thấy “ổn hết,” rồi job thật thất bại, hoặc tệ hơn là thành công với kết quả khác. Giữ một parser chung, một tập luật chung và cùng logic khớp xuyên suốt.
Logic khớp mơ hồ là lỗi kinh điển khác. “Khớp theo email” nghe đơn giản cho đến khi gặp trùng, khác chữ hoa/chữ thường, hoặc người dùng đổi email. UI nên nêu chính xác cách khớp và chuyện gì xảy ra khi nhiều kết quả hoặc không có kết quả. Ví dụ: admin sales import 2.000 contact chờ cập nhật, nhưng hệ thống tạo mới vì khớp chỉ theo email và nửa file dùng phone.
Cẩn thận với các “tự sửa” hữu ích. Cắt chuỗi im lặng, trim tự động, hay đoán định dạng ngày có thể che mất mất mát dữ liệu. Nếu bạn chuẩn hoá giá trị, hiển thị trong preview (giá trị cũ -> giá trị mới) và cảnh báo chuyển đổi rủi ro. Nếu trường sẽ bị cắt để vừa độ dài, làm đó thành cảnh báo rõ ràng.
Đừng để người dùng mất kết quả. Nếu họ đóng tab và báo cáo biến mất, support sẽ tới. Lưu mỗi import run như một object với trạng thái, file kết quả và tóm tắt rõ ràng.
Lập kế hoạch cho scale nữa. Không batching sẽ gây timeout và ghi chép cục bộ khi có khối lượng thực. Bảo vệ hệ thống bằng batching và cập nhật tiến độ, rate limits và backoff, idempotency keys, xử lý rõ ràng cho thành công một phần, và tuỳ chọn “chạy lại các dòng lỗi.”
Checklist đơn giản và bước tiếp theo
Thay đổi hàng loạt an toàn khi mọi người biết điều gì sẽ xảy ra, điều gì có thể sai, và cách bạn nhanh phát hiện vấn đề.
Kiểm tra tiền chuyến nhanh (trước khi ai bấm Commit)
Làm một kiểm tra thực tế nhỏ trên dữ liệu, không chỉ trên UI. Chọn vài dòng đại diện cho trường hợp phổ biến và trường hợp méo mó.
- Spot-check một mẫu nhỏ (ví dụ 20 dòng): tên, ngày và số trông đúng.
- Xác nhận mapping trường khớp cột nguồn (và ô trống làm gì như bạn mong muốn).
- Kiểm tra khóa khớp (email, SKU, external ID) đủ duy nhất và tồn tại.
- So sánh tổng: bao nhiêu tạo, cập nhật, bỏ qua.
- Đọc to các cảnh báo để mọi người đồng ý là chấp nhận được.
Tạm dừng cho một quyết định con người. Nếu import ảnh hưởng khách hàng, thanh toán hoặc tồn kho, hãy có một người chịu trách nhiệm phê duyệt preview và các con số. Nếu manager sales mong 1.200 contact được cập nhật mà preview cho thấy 12.000, đừng tiến hành cho đến khi biết lý do.
Kiểm tra sau commit (để sự cố không kéo dài)
Khi commit xong, kiểm tra lại thực tế, nhưng giữ trọng tâm.
- Mở vài bản ghi đã cập nhật và xác nhận trường then chốt thay đổi đúng.
- Export báo cáo kết quả với trạng thái theo dòng, ID được tạo và bất kỳ lỗi nào.
- Ghi lại đã xảy ra gì: ai chạy, khi nào, file/phiên bản nào, và các con số tóm tắt.
- Nếu có lỗi, quyết định nhanh: sửa-chạy-lại các dòng lỗi hoặc rollback.
Nếu bạn xây quy trình này trên nền tảng no-code, tốt nhất nên coi import như một tính năng sản phẩm thực thụ chứ không phải script admin một lần. Ví dụ, trong AppMaster (appmaster.io) các team thường mô hình một Import Run record trong PostgreSQL, triển khai logic dry-run và commit trong Business Process Editor, và giữ audit trail rõ ràng để cập nhật hàng loạt dễ lặp lại và hỗ trợ hơn khi có sự cố.
Câu hỏi thường gặp
Sử dụng quy trình ba bước: xem trước, xác thực rồi mới áp dụng. Xem trước cho biết sẽ thay đổi gì, xác thực chạy thử dùng cùng luật như khi áp dụng, và nút áp dụng chỉ bật sau khi batch đó đã vượt qua xác thực.
Một màn hình preview cho phép người dùng phát hiện lỗi rõ ràng trước khi ghi, ví dụ mapping sai, số lượng tạo vs cập nhật bất ngờ, hoặc ô trống sẽ ghi đè dữ liệu. Nó nên hiển thị tổng quan và một mẫu nhỏ trước-và-sau để kiểm tra nhanh.
Xác thực chạy thử áp cùng parser, matching, kiểm tra quyền và luật nghiệp vụ như khi cập nhật thật, nhưng không ghi vào cơ sở dữ liệu. Kết quả cần là một bản tóm tắt rõ ràng kèm danh sách vấn đề gắn với từng dòng để người dùng sửa lỗi dễ dàng.
Dừng toàn bộ khi job không an toàn tổng thể — ví dụ workspace sai, mapping nguy hiểm, hoặc import sẽ ghi đè các trường quan trọng. Với những lỗi có thể sửa từng dòng (ví dụ định dạng điện thoại sai ở vài dòng), cho phép người dùng sửa và giữ phần còn lại sẵn sàng.
Hãy khai báo rõ khóa so khớp. ID nội bộ ổn nhất, external ID tốt cho tích hợp, email có thể dùng nhưng cần xử lý trùng và chuẩn hoá để tránh tạo bản ghi mới vô ý.
Đừng giấu hành vi. Quyết định rõ với mỗi trường: ô trống có giữ nguyên giá trị hiện tại, xoá giá trị hay áp default. Và hiển thị quy tắc đó trong preview để người dùng không bị bất ngờ.
Hiển thị số dòng kèm identifier ổn định như email hoặc external ID, nêu rõ cột và trường đích, rồi cho thông điệp đơn giản kèm gợi ý sửa. Mục tiêu là người dùng sửa file nguồn nhanh rồi chạy lại mà không phải giải thích lỗi khó hiểu.
Commit atomic phù hợp khi cần nhất quán (tiền, tồn kho, quyền), vì bất kỳ lỗi nào sẽ huỷ toàn bộ. Partial commit phù hợp với các cập nhật độc lập như làm giàu dữ liệu liên hệ, miễn là UI báo rõ một số dòng có thể bị bỏ qua.
Dùng một idempotency key gắn với batch đã xác thực và khoá trạng thái job để phép chuyển trạng thái chỉ xảy ra một lần. Điều này chống lại double-click, retry hay làm mới trang gây áp dụng đôi.
Mô hình một Import Run trong PostgreSQL, lưu batch ID, lựa chọn mapping, kết quả xác thực và outcomes cuối cùng, rồi cài logic chạy thử và commit trong Business Process. Điều này cho luồng lặp lại và có audit trail khi cần support.


