Procedure và transaction boundary
Procedure thực hiện DML không đồng nghĩa nó phải tự COMMIT; ranh giới transaction thường thuộc service hoặc caller điều phối toàn bộ workflow.
Ai sở hữu transaction?
Reusable procedure nên thực hiện công việc và trả lỗi; caller quyết định COMMIT khi toàn bộ use case thành công.
Nếu procedure A tự COMMIT rồi procedure B lỗi, caller không thể rollback A — transaction bị chia vụn.
Exception không tự rollback toàn bộ
Một statement lỗi được rollback ở mức statement. Những DML trước đó trong transaction vẫn pending cho tới khi caller COMMIT hoặc ROLLBACK.
SAVEPOINT
SAVEPOINT ten; và ROLLBACK TO ten; cho phép hoàn tác một phần mà vẫn giữ phần trước savepoint.
DDL
CREATE/ALTER/DROP gây implicit commit trước và sau DDL trong Oracle. Không trộn DDL tùy tiện vào workflow transaction.
Autonomous transaction
PRAGMA AUTONOMOUS_TRANSACTION tạo transaction độc lập, thường dùng cho audit logging. Nó phải tự COMMIT/ROLLBACK và cần dùng rất thận trọng.
Quy tắc mặc định tốt: không COMMIT trong procedure business dùng lại; ghi rõ nếu procedure cố ý sở hữu transaction.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Ai sở hữu transaction?
Reusable procedure nên thực hiện công việc và trả lỗi; caller quyết định COMMIT khi toàn bộ use case thành công.
Nếu procedure A tự COMMIT rồi procedure B lỗi, caller không thể rollback A — transaction bị chia vụn.
Exception không tự rollback toàn bộ
Một statement lỗi được rollback ở mức statement. Những DML trước đó trong transaction vẫn pending cho tới khi caller COMMIT hoặc ROLLBACK.
SAVEPOINT
SAVEPOINT ten; và ROLLBACK TO ten; cho phép hoàn tác một phần mà vẫn giữ phần trước savepoint.
DDL
CREATE/ALTER/DROP gây implicit commit trước và sau DDL trong Oracle. Không trộn DDL tùy tiện vào workflow transaction.
Autonomous transaction
PRAGMA AUTONOMOUS_TRANSACTION tạo transaction độc lập, thường dùng cho audit logging. Nó phải tự COMMIT/ROLLBACK và cần dùng rất thận trọng.
Quy tắc mặc định tốt: không COMMIT trong procedure business dùng lại; ghi rõ nếu procedure cố ý sở hữu transaction.
Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Oracle PL/SQL. Browser không có Oracle Server; editor dùng dialect PL/SQL và nút bên dưới chạy mô phỏng trên dữ liệu mẫu.
Đang tải trình soạn thảo…
Tạo procedure update_order_total(p_order_id IN NUMBER, p_total IN NUMBER) chỉ UPDATE orders, không COMMIT/ROLLBACK.
Đang tải trình soạn thảo…
Viết caller: SAVEPOINT before_update, gọi update_order_total cho order 1 total 99, rồi ROLLBACK TO before_update.
Đang tải trình soạn thảo…
- Chạy thử truy vấn mẫu
- Hoàn thành bài tập (0/2)