Nói chung, thủ tục không nên cam kết. Những loại quyết định kiểm soát giao dịch đó nên được để lại cho mã cấp cao hơn để biết khi nào một giao dịch logic thực sự hoàn tất. Nếu bạn cam kết bên trong một thủ tục được lưu trữ, bạn đang giới hạn khả năng sử dụng lại bởi vì người gọi muốn các thay đổi mà thủ tục thực hiện là một phần của giao dịch lớn hơn có thể chỉ cần gọi thủ tục trực tiếp.
Nếu bạn gọi một thủ tục một cách tương tác, bạn sẽ phải cam kết rõ ràng hoặc hoàn trả giao dịch vì Oracle không biết bạn có ý định gọi thủ tục là giao dịch hợp lý hay nếu bạn có ý định soạn một giao dịch lớn hơn liên quan đến nhiều cuộc gọi thủ tục. Nếu bạn sử dụng dbms_scheduler
, dbms_scheduler
giả sử rằng một công việc là một giao dịch hợp lý và cam kết khi kết thúc công việc giả định rằng nó đã thành công ( dbms_job
thực hiện điều tương tự).
Các chức năng không nên thao tác dữ liệu ở vị trí đầu tiên. Hàm thao tác dữ liệu không thể được gọi từ câu lệnh SQL (chặn trường hợp góc trong đó chính hàm được khai báo để sử dụng giao dịch tự trị gần như không bao giờ phù hợp). Điểm chung của việc có cả hai hàm và thủ tục là các hàm có thể được nhúng trong các câu lệnh SQL và có thể được cấp tự do hơn cho người dùng vì chúng không thay đổi bất kỳ dữ liệu nào.