Tôi nghĩ rằng hầu hết các trường hợp, sự khác biệt giữa hai điều đó sẽ đủ nhỏ đến mức sự lựa chọn chủ yếu nên được thúc đẩy bằng cách chọn cách triển khai mà kết quả là dễ hiểu nhất đối với người xem mã lần đầu tiên.
Tuy nhiên, tôi nghĩ rằng việc xử lý ngoại lệ có một số nhỏ ưu điểm:
-
Xử lý ngoại lệ tránh tình trạng chạy đua tiềm ẩn. Phương pháp 'kiểm tra, sau đó chèn' có thể không thành công nếu một quy trình khác chèn một bản ghi giữa séc và phụ trang của bạn. Vì vậy, ngay cả khi bạn đang thực hiện 'kiểm tra rồi chèn', bạn vẫn muốn xử lý ngoại lệ trên chèn và nếu bạn đang thực hiện xử lý ngoại lệ thì bạn cũng có thể bỏ kiểm tra ban đầu.
-
Nếu mã của bạn không phải là một thủ tục được lưu trữ và phải tương tác với cơ sở dữ liệu qua mạng (tức là ứng dụng và db không nằm trên cùng một hộp), thì bạn muốn tránh có hai cuộc gọi mạng riêng biệt (một để kiểm tra và khác cho phần chèn) và thực hiện nó thông qua xử lý ngoại lệ cung cấp một cách đơn giản để xử lý toàn bộ vấn đề chỉ với một cuộc gọi mạng. Hiện tại, có rất nhiều cách để thực hiện phương pháp 'kiểm tra rồi chèn' trong khi vẫn tránh được cuộc gọi mạng thứ hai, nhưng chỉ cần bắt ngoại lệ có thể là cách đơn giản nhất để thực hiện.
Mặt khác, việc xử lý ngoại lệ yêu cầu một ràng buộc duy nhất (thực sự là một chỉ mục duy nhất), đi kèm với sự đánh đổi hiệu suất:
- Việc tạo một ràng buộc duy nhất sẽ chậm trên các bảng rất lớn và nó sẽ gây ra hiệu suất trên mỗi lần chèn vào bảng đó. Trên cơ sở dữ liệu thực sự lớn, bạn cũng phải dự trù cho dung lượng ổ đĩa bổ sung được sử dụng bởi chỉ mục duy nhất được sử dụng để thực thi ràng buộc.
- Mặt khác, nó có thể giúp việc chọn từ bảng nhanh hơn nếu các truy vấn của bạn có thể tận dụng chỉ mục đó.
Tôi cũng xin lưu ý rằng nếu bạn đang ở trong tình huống mà những gì bạn thực sự muốn làm là 'cập nhật khác chèn' (tức là nếu một bản ghi có giá trị duy nhất đã tồn tại thì bạn muốn cập nhật bản ghi đó, nếu không, bạn chèn một bản ghi mới record) thì những gì bạn thực sự muốn sử dụng là phương thức UPSERT của cơ sở dữ liệu cụ thể của bạn, nếu nó có. Đối với SQL Server và Oracle, đây sẽ là một câu lệnh MERGE.