2012-07-06 34 views
5

Từ http://www.sqlite.org/lang_conflict.htmlsqlite ON khác biệt mâu thuẫn giữa Abort và FAIL

Abort Khi một hạn chế vi phạm áp dụng xảy ra, thuật toán giải quyết hủy bỏ hủy bỏ các câu lệnh SQL hiện với một lỗi SQLITE_CONSTRAIT và sao lưu ra bất kỳ thay đổi được thực hiện bởi hiện tại Câu lệnh sql; nhưng các thay đổi do các câu lệnh SQL trước trong cùng một giao dịch được giữ nguyên và giao dịch vẫn hoạt động. Đây là hành vi mặc định và hành vi đã đăng ký tiêu chuẩn SQL.

FAIL Khi xảy ra vi phạm ràng buộc áp dụng, thuật toán phân giải FAIL sẽ hủy bỏ câu lệnh SQL hiện tại bằng lỗi SQLITE_CONSTRAINT. Nhưng độ phân giải FAIL không trả lại các thay đổi trước của câu lệnh SQL thất bại cũng như không kết thúc giao dịch. Ví dụ, nếu một câu lệnh UPDATE gặp phải một sự vi phạm ràng buộc trên hàng thứ 100 mà nó cố gắng cập nhật, thì 99 thay đổi hàng đầu tiên được giữ nguyên nhưng những thay đổi đối với các hàng 100 và hơn thế nữa không bao giờ xảy ra.

Cả hai thay đổi bảo toàn được thực hiện trước tuyên bố gây ra vi phạm ràng buộc và không kết thúc giao dịch. Vì vậy, tôi cho rằng sự khác biệt duy nhất là độ phân giải FAIL không cho phép thay đổi thêm, trong khi ABORT chỉ sao lưu chỉ xung đột. Tôi có đúng không?

+0

Cách diễn giải của bạn không khớp với tài liệu được dán ở đây. ABORT: cuộn lại toàn bộ câu lệnh sql nhưng không ảnh hưởng đến các sql khác trong cùng một txn. FAIL: chỉ ngăn chặn hàng lỗi cụ thể (và các hàng tiếp theo trong cùng câu lệnh SQL) - nhưng cho phép các hàng khác được thay đổi. FAIL và ABORT đều cho phép các câu lệnh khác trong cùng một txn để tiến hành. – javadba

Trả lời

10

Câu trả lời rất đơn giản: FAIL không thực hiện các thay đổi rollback do câu lệnh hiện tại thực hiện.

Xem xét việc này 2 bảng:

CREATE TABLE IF NOT EXISTS constFAIL (num UNIQUE ON CONFLICT FAIL); 
CREATE TABLE IF NOT EXISTS constABORT (num UNIQUE ON CONFLICT ABORT); 
INSERT INTO constFAIL VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10); 
INSERT INTO constABORT VALUES (1),(3),(4),(5),(6),(7),(8),(9),(10); 

Tuyên bố

UPDATE constABORT SET num=num+1 WHERE num<10 

sẽ thất bại và thay đổi gì cả. Nhưng satement này

UPDATE constFAIL SET num=num+1 WHERE num<10 

sẽ cập nhật hàng đầu tiên, sau đó thất bại và rời khỏi 1 hàng được cập nhật, vì vậy các giá trị mới là 2, 3, 4, 5, 6, 7, 8, 9, 10

Các vấn đề liên quan