Hiệu quả của việc đặt cam kết như thế này trong chương trình là gì?
Tài liệu Oracle mô tả COMMIT
như:
Mục đích
Sử dụng
COMMIT
tuyên bố kết thúc giao dịch hiện tại của bạn và thực hiện vĩnh viễn tất cả các thay đổi được thực hiện trong giao dịch. Một giao dịch là một chuỗi các câu lệnh SQL mà Cơ sở dữ liệu Oracle coi như một đơn vị duy nhất. Câu lệnh này cũng xóa tất cả các điểm lưu trong giao dịch và gia tăng các khóa giao dịch.
Nếu bạn có ba PROCEDURE
và mỗi cái chứa một COMMIT
khi đó bạn không thể chạy cả ba câu lệnh, nếu một ngoại lệ xảy ra trong câu lệnh thứ hai, hãy ROLLBACK
tất cả chúng vì những thay đổi từ hai thay đổi đầu tiên sẽ là COMMIT
ted.
Theo nguyên tắc chung, bạn không nên sử dụng COMMIT
trong một PROCEDURE
hoặc FUNCTION
nhưng nên để người gọi COMMIT
giao dịch để chúng có thể nhóm nhiều hành động lại với nhau.
Tất nhiên, có những trường hợp sử dụng mà bạn sẽ muốn vi phạm quy tắc này nhưng bạn nên xem xét từng trường hợp riêng biệt và dành thời gian để hiểu đầy đủ logic nghiệp vụ của mình trước khi vi phạm quy tắc này để bạn biết thế nào là COMMIT
ted trong mỗi trường hợp.
Tôi có nên thực hiện giao dịch này bằng
AUTONOMOUS_TRANSACTION
không ?
Một ca sử dụng là ghi nhật ký - bạn có thể có PROCEDURE
mà gọi một PROCEDURE
khác để ghi nhật ký hành động của người dùng và, bất kể hành động ban đầu thành công hay thất bại, bạn muốn giữ nhật ký của hành động đó và đảm bảo nhật ký đó là COMMIT
ted. Trong trường hợp này, PROCEDURE
ghi nhật ký phải là AUTONOMOUS_TRANSACTION
và chứa COMMIT
câu lệnh và câu lệnh gọi không nên (có thể).
Vì vậy, nếu COMMIT
của một PROCEDURE
luôn được yêu cầu và không phụ thuộc vào việc người gọi có COMMIT
hay không dữ liệu khác sau đó thực hiện PROCEDURE
một AUTONOMOUS_TRANSACTION
. Nếu PROCEDURE
s có thể được nhóm lại với nhau và sau đó ROLLBACK
với tư cách là một nhóm thì bạn không muốn đặt họ thành AUTONOMOUS_TRANSACTION
s.