Cam kết bên trong một vòng lặp nói chung là một ý tưởng tồi (cho phép bất kỳ công cụ nào tự động cam kết).
Cam kết bên trong một vòng lặp khiến việc viết mã có thể khởi động lại khó hơn nhiều. Điều gì xảy ra nếu bạn gặp lỗi sau 3 lần lặp lại? Bây giờ bạn đã cam kết thành công kết quả của 2 UPDATE
các câu lệnh. Có lẽ, sau đó bạn cần tìm ra hàng nào đã được cập nhật và viết mã để đảo ngược cập nhật hoặc bạn sẽ phải thêm mã để tránh cố gắng cập nhật dữ liệu cho hai yearid
thành công đó các giá trị. Điều đó chắc chắn là có thể. Nhưng nó liên quan đến việc viết một loạt mã để theo dõi tiến trình của bạn và thường làm cho mã của bạn phức tạp hơn nhiều.
Cam kết bên trong một vòng lặp làm cho mã của bạn chậm hơn nhiều. Cam kết thường là một hoạt động khá tốn kém. Do đó, thực hiện nó theo một vòng lặp, nói chung là một ý tưởng tồi. Sẽ ít vấn đề hơn nếu bạn chỉ có vài chục lần lặp vòng lặp. Nhưng nếu bạn có hàng trăm hoặc hàng nghìn lần lặp lại, bạn có thể dễ dàng dành phần lớn thời gian để cam kết.
Cam kết bên trong một vòng lặp về cơ bản làm tăng nguy cơ bạn gây ra lỗi ORA-01555. Truy vấn của bạn đối với MyTable
cần một cái nhìn nhất quán về dữ liệu. Tuy nhiên, nếu bạn cam kết bên trong vòng lặp, bạn đang nói với Oracle rằng phiên của bạn không cần UNDO
cũ hơn nữa dữ liệu. Nếu Oracle tình cờ xóa UNDO
dữ liệu mà bạn cần cho một lần lặp tiếp theo của vòng lặp, bạn sẽ gặp lỗi. Và sau đó bạn quay lại xử lý mã không thể khởi động lại, trong đó bạn đã trải qua N lần lặp thành công nhưng bạn không biết năm nào đã được xử lý hoặc năm nào cần được xử lý.
Cam kết bên trong một vòng lặp có thể tạo ra các vấn đề về tính nhất quán của dữ liệu. Ví dụ:nếu một số phiên khác đang chạy báo cáo, thì các báo cáo đó sẽ dễ dàng nhìn thấy dữ liệu được cập nhật một phần, điều này thường có nghĩa là dữ liệu sẽ không nhất quán. Nếu dữ liệu trong 3 năm đã thay đổi nhưng các năm khác không thay đổi, có thể rất khó để báo cáo có ý nghĩa và mọi người (hoặc quy trình) có thể dễ dàng đưa ra quyết định không chính xác.
Cam kết bên trong một vòng lặp cũng làm cho mã của bạn ít được tái sử dụng hơn. Nếu mã của bạn bao gồm các cam kết (hoặc khôi phục ngoài một điểm lưu mà bạn đã thiết lập bên trong khối), thì nó không thể được gọi bằng bất kỳ đoạn mã nào khác chưa muốn giao dịch của nó được cam kết. Điều đó khiến mọi người cố gắng triển khai lại logic của bạn mà không có sự kiểm soát giao dịch hoặc vi phạm không chính xác tính toàn vẹn của giao dịch, điều này chắc chắn khiến họ phải xây dựng các ứng dụng gây ra các vấn đề về tính nhất quán của dữ liệu.