MySQL
chuyển mã lỗi cho người gọi và dựa trên mã lỗi này, người gọi có thể tự do quyết định xem họ có muốn hoàn thành công việc cho đến thời điểm này hay không (bỏ qua lỗi với INSERT
cụ thể này tuyên bố) hoặc để khôi phục giao dịch.
Điều này không giống như PostgreSQL
vốn luôn hủy bỏ giao dịch do nhầm lẫn và hành vi này là nguồn gốc của nhiều vấn đề.
Cập nhật:
Việc sử dụng ROLLBACK
vô điều kiện là một thực tiễn tồi bên trong các thủ tục được lưu trữ.
Các thủ tục được lưu trữ có thể xếp chồng lên nhau và các giao dịch thì không, do đó, một ROLLBACK
trong một thủ tục được lưu trữ lồng nhau sẽ quay trở lại thời điểm ban đầu của giao dịch, không phải trạng thái thực thi thủ tục đã lưu trữ.
Nếu bạn muốn sử dụng các giao dịch để khôi phục trạng thái cơ sở dữ liệu khi có lỗi, hãy sử dụng SAVEPOINT
cấu trúc và DECLARE HANDLER
để quay lại các điểm lưu:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Không thành công trong một trong hai lần chèn sẽ khôi phục tất cả các thay đổi được thực hiện bởi quy trình và thoát khỏi nó.